7人拼團即拼商城399系統開發模式
阿新 • • 發佈:2020-08-03
正則表示式:由一系列特殊字元拼接而成的表示式/規則,該表示式用於從一個大字串中 匹配出符合規則的子字串
正則表示式在所有語言中,都是通用的。
模式 | 描述 |
---|---|
\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']