1. 程式人生 > 實用技巧 >7人拼團即拼商城399系統開發模式

7人拼團即拼商城399系統開發模式

正則表示式:由一系列特殊字元拼接而成的表示式/規則,該表示式用於從一個大字串中 匹配出符合規則的子字串

正則表示式在所有語言中,都是通用的。

模式 描述
\w 匹配:數字、字母、下劃線
\W 匹配:非數字、字母、下劃線
\s 匹配:任意非空白字元,等價於 [\t \n \r \f]
\S 匹配:任意非空字元
\d 匹配:任意數字,等價於 [0-9]
\D 匹配:任意非數字字元
\A 匹配:字串開始
\z 匹配:字串結束
\Z 匹配:字串結束(如果存在換行,則只匹配到換行之前的結束字串)
\G 匹配:最後匹配完成的位置
\n 匹配:一個換行符
\t 匹配:一個製表符
^ 匹配:字串的開頭
$ 匹配:字串的末尾
. 匹配:任意字元(除了換行符 \n)末尾加上 re.DOTALL則可以包括任意字元(包括換行符)
[...] 匹配:表示一組字元(除了換行符 \n)
[^...] 匹配:不在[]中的字元
* 匹配:0個或多個表示式,貪婪
+ 匹配:1個或多個表示式,貪婪
? 匹配:0個或1個前面的正則表示式定義的片段,非貪婪
{n} 匹配:精確匹配n個前面的表示式
{n,m} 匹配:n到m次 由前面的正則表示式定義的片段,非貪婪
a丨b 匹配:a或者b
{} 匹配:括號內的表示式,表示一個分組

\w 匹配:數字 字母 下劃線

print(re.findall('\w', "hello 123_(0"))

# \w:匹配 數字、字母、下劃線(不包括空格)
# ['h', 'e', 'l', 'l', 'o', '1', '2', '3', '_', '0']
print(re.findall('\w\w\w', "hello 123_(0"))

# \w\w\w:連續匹配3個連續的數字、字母、下劃線(不包括空格),遇到空格就直接往後繼續匹配
# ['hel', '123']

\W匹配:非數字 字母 下劃線

print(re.findall('\W', "hello 123_(0"))

# \W:匹配除了數字 字母 下劃線之外的字元(包括空格)
# [' ', '(']

\s 匹配:任意空白字元,等價於[\t \n \r \f]

print(re.findall('\s', "h ello 123_(0"))

# \s:匹配空白字串
# [' ', ' ']

\S 匹配:任意非空字元

print(re.findall('\S', "h ello 123_(0"))

# \S:匹配非空字元(除了空格和換行符之外的字元)
# ['h', 'e', 'l', 'l', 'o', '1', '2', '3', '_', '(', '0']

\d 匹配任意數字 [0-9]

print(re.findall('\d', "h ello 123_(0"))

# 匹配數字1-9
# ['1', '2', '3', '0']

\D 匹配任意非數字

print(re.findall('\D', "h ello 123_(0"))

# 匹配除了1-9之外的所有字元(包括空格、換行符	)
# ['h', ' ', 'e', 'l', 'l', 'o', ' ', '_', '(']

\n 匹配一個換行符

res = '''a sd  \tasd\n
    \t1
2

3
'''
print(re.findall('\n', res))

# \n:匹配帶有換行符的字串
# ['\n', '\n', '\n', '\n', '\n', '\n']

\t 匹配一個製表符

msg="""h e\tll\n\no 123_ (0
\t1
"""
print(re.findall('\t',msg))

# \t:匹配帶有製表符的字串
# ['\t', '\t']

^ 匹配以...開頭的字元

print(re.findall("^xxq", "xxq asdf 213123 xxqafsadfasdn"))

# ^xxq:匹配以xxq開頭的字串
# ['xxq']

$ 匹配以...結尾的字元

print(re.findall("xxq$","xxq asdf 213123 xxqafsadfxxq"))

# xxq$:匹配以xxq為結尾的字串
# ['xxq']

. 匹配任意一個字元(除了換行符\n

print(re.findall("a.b", "a1b a2b aab aaaaaaab a+b a-b a b a c"))

# a.b:匹配a和b中間有任意字元的字串(除了換行符)
# ['a1b', 'a2b', 'aab', 'aab', 'a+b', 'a-b', 'a b']

[] 匹配一個字元,並且可以指定該字元的範圍

中間如果要匹配-,一定要放到最左邊或者最右邊,不然會被認定是一個範圍符號

print(re.findall("a[+-]b", "a1b a2b aab aaaaaaab a+b a-b a c"))
# ['a+b', 'a-b']

print(re.findall("a[.*/+-]b", "a.b a2b a*b a/b aab aaaaaaab a+b a-b a c"))
# ['a.b', 'a*b', 'a/b', 'a+b', 'a-b']

print(re.findall("a[a-z]b", "a.b a2b a*b a/b aab aaaaaaab a+b a-b a c"))  # -放在[]內的開頭或結果
# ['aab', 'aab']

print(re.findall("a[a-zA-Z]b", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c"))  # -放在[]內的開頭或結果
# ['aAb', 'aCb', 'aab', 'aab']

print(re.findall("a\db", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c"))  # -放在[]內的開頭或結果
# ['a2b']

print(re.findall("a[0-9]b", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c"))  # -放在[]內的開頭或結果
# ['a2b']

[^...]代表取反

print(re.findall("a[^0-9]b", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c"))

# a[^0-9]b:匹配所有a和b中間不是數字的字串
# ['a.b', 'a*b', 'a/b', 'aAb', 'aCb', 'aab', 'aab', 'a+b', 'a-b']

* 左邊的字元出現0次或者無窮次

print(re.findall("ab*", "a ab abb abbbbbbbbbbbb bbbbbbbbb"))

# ab*:匹配任意a後面b出現任意次的字串
# ['a', 'ab', 'abb', 'abbbbbbbbbbbb']

+左邊的字元出現1次或者無窮次

print(re.findall("ab+", "a ab abb abbbbbbbbbbbb bbbbbbbbb"))

# ab*:匹配任意a後面b出現一次或者任意多次的字串
# ['ab', 'abb', 'abbbbbbbbbbbb']

{n,m} 左邊的字元出現n-m次

print(re.findall("ab{0,}", "a ab abb abbbbbbbbbbbb bbbbbbbbb"))

# ab{0,}:匹配到a之後b出現任意次數的字串
# ['a', 'ab', 'abb', 'abbbbbbbbbbbb']

拓展

print(re.findall("a\db","a1b a2b aab aaaaaaab a+b a-b a c"))

# a\db:匹配a和b中間有一個數字的字串
# ['a1b', 'a2b']
print(re.findall("a\wb","a1b a2b aab aaaaaaab a+b a-b a c"))
# a\wb:匹配a和b中間有一個數字字母下劃線的字串
# ['a1b', 'a2b', 'aab', 'aab']
print(re.findall("a.b","a1b a2b aab aaaaaaab a+b a-b a b a c"))
# .:匹配a和b中間有一個任意字元的字串(不包括\n)
# ['a1b', 'a2b', 'aab', 'aab', 'a+b', 'a-b', 'a b']
print(re.findall("a.b", "a1b a2b aab aaaaaaab a\tb a-b a\nb a c", re.DOTALL))
# .:匹配a和b中間有一個任意字元的字串(加了re.DOTALL可以匹配換行符)
# ['a1b', 'a2b', 'aab', 'aab', 'a\tb', 'a-b', 'a\nb']