1. 程式人生 > >python 字符串之常用正則

python 字符串之常用正則

alt python3 pos style 整數 fortran 匹配 分享圖片 d+

一、前面簡單寫了一下re模塊操作字符串的寫法,加上正則之後 re模塊才能發揮更強大的功能。

先看看常見的正則符號:

技術分享圖片

復習一下基礎的re模塊:

import re
text = c++ python2 python3 perl ruby lua java javascript php4 php5 c

#match,search,findall,split,sub
re.match(rjava,text)#只找頭,沒有的話返回none 返回一個<_sre.SRE_Match object; span=(34, 38), match=‘java‘>

re.search(r
java,text)#從頭開始找,找符合的字符 # <_sre.SRE_Match object; span=(34, 38), match=‘java‘> re.match(rc\++,text),re.match(rc\+\+,text)#作用相同 #<_sre.SRE_Match object; span=(0, 3), match=‘c++‘> re.findall(rpython,text) #返回所有的python # [‘python‘, ‘python‘] re.split(r perl ,text)#以某個字符為中心拆分 #[‘c++ python2 python3‘, ‘ruby lua java javascript php4 php5 c‘]
re.sub(rruby,fortran,text) #替換某個字符 #‘c++ python2 python3 perl fortran lua java javascript php4 php5 c‘

二、正則常用

text = ‘c++ python2 python3 perl ruby lua java javascript php4 php5 c‘
1 ^   start 從開頭開始匹配
  例: re.findall(r‘^c..‘,text)
        輸出#[‘c++‘]


2 . except \n 匹配除換行符以外所有字符
    re.findall(r‘^c‘,text)

      #[‘c‘]
re.findall(r‘^c.‘,text)
#[‘c+‘]


3 + 1-inf 匹配一個或一個以上相同的值從1---無窮
   re.findall(r‘c+‘,text)
    #[‘c‘, ‘c‘, ‘c‘]
   re.findall(r‘c\++‘,text)
    #[‘c++‘]

4 $ end 匹配最後一個字符
    re.findall(r‘c$‘,text)




5 [] or 指的是或
  re.findall(r‘p[a-zA-Z]+‘,text) #匹配p字符後面是(a-z)從小寫字符a-z和大寫A-Z的字符 #{1,}匹配1到無窮個
    #[‘python‘, ‘python‘, ‘perl‘, ‘pt‘, ‘php‘, ‘php‘]

6 * 0-inf 0到無窮個
  re.findall(r‘p[a-zA-Z]*‘,text)
    #[‘python‘, ‘python‘, ‘perl‘, ‘pt‘, ‘php‘, ‘php‘]

7 ? 0-1 匹配0--1個
  re.findall(r‘p[a-zA-Z]?‘,text)
    #[‘py‘, ‘py‘, ‘pe‘, ‘pt‘, ‘ph‘,‘p‘, ‘ph‘, ‘p‘]
  re.findall(r‘p[a-zA-Z0-9]{3,}‘,text) #{3,}指的是匹配三個字母以上
    #[‘python2‘, ‘python3‘, ‘perl‘, ‘php4‘, ‘php5‘]

  re.findall(r‘c[a-zA-Z]*‘,text)
    #[‘c‘, ‘cript‘, ‘c‘]
  re.findall(r‘c[^a-zA-Z]*‘,text) # ^號也可以指非的意思(當^號在中括號裏面) 匹配非字母的符號
    #[‘c++ ‘, ‘c‘, ‘c‘]

8 | or 或也可以寫成|號 看看他與[]號的區別
  re.findall(r‘[pj][a-zA-Z]+‘,text) #{1,inf}
    #[‘python‘, ‘python‘, ‘perl‘, ‘java‘, ‘javascript‘, ‘php‘, ‘php‘]
 |重寫上面的pattern
  re.findall(r‘p|j[a-zA-Z]+‘,text) #|號指的是前面的或者是後面的因此需要修改程序
    #[‘p‘, ‘p‘, ‘p‘, ‘java‘, ‘javascript‘, ‘p‘, ‘p‘, ‘p‘, ‘p‘]
  re.findall(r‘p[a-zA-z]+|j[a-zA-Z]+‘,text) #相當於[pj][a-z][A-Z]的分開
  re.findall(r‘p[^0-9]+|j[a-zA-Z]+‘,text) #註意空格也會被匹配為非數字
    #[‘python‘, ‘python‘, ‘perl ruby lua java javascript php‘, ‘php‘]
  re.findall(r‘p[^0-9 ]+|j[a-zA-Z]+‘,text)
    #[‘python‘, ‘python‘, ‘perl‘, ‘java‘, ‘javascript‘, ‘php‘, ‘php‘]

9 \w [a-zA-Z0-9_], \W #匹配所有的小寫大寫下劃線 \W指的是\w的非

  re.findall(r‘p\w+‘,text)
    #[‘python2‘, ‘python3‘, ‘perl‘, ‘pt‘, ‘php4‘, ‘php5‘]

10 \d [0-9], \D ##匹配所有的數字 \D是\d的非
  re.findall(r‘p\w+\d‘,text)
  re.findall(r‘p\w+[0-9]‘,text)
  re.findall(r‘p\w{5,9}‘,text) #匹配有5--9個字符
    #[‘python2‘, ‘python3‘]

11 \s [ \t\n\r\f\v], \S#匹配所有的空白字符



12 \b word boundary 匹配一個字符的邊界,以什麽開始什麽結束
  re.findall(r‘\bp[^0-9]‘,text)
    #[‘py‘, ‘py‘, ‘pe‘, ‘ph‘, ‘ph‘]
  re.findall(r‘p[^0-9]\b‘,text)
    #[‘pt‘]
13 \B not \b
  \A input start, ^
   \Z input end, $ 同上


14 貪婪與非貪婪
 *貪婪模式盡可能的匹配多
*? 0~inf non-greedy #非貪婪模式盡可能匹配少
+? 1~inf non-greedy #非貪婪模式盡可能匹配少
re.findall(r‘p[a-z]*‘,text)
  #[‘python‘, ‘python‘, ‘perl‘, ‘pt‘, ‘php‘, ‘php‘]
re.findall(r‘p[a-z]*?‘,text)
  #[‘p‘, ‘p‘, ‘p‘, ‘p‘, ‘p‘, ‘p‘, ‘p‘, ‘p‘]
re.findall(r‘p[a-z]+\b‘,text)
re.findall(r‘p[a-z]+?\b‘,text)

15 分組
(?P<name>pattern)
a=re.search(r‘(p[a-zA-Z]+)([0-9])‘,‘python2‘,re.X) #re.X可以不寫(re.X)編譯字符裏面可以註釋
a.group(1), a.group(2)
  #‘python‘
  #‘2‘

a=re.search(r‘(?P<name>p[a-zA-Z]+)(?P<version>[0-9])‘,‘python2‘) #以字典形式輸出
a.group(‘name‘), a.group(‘version‘)
a.groupdict()
  #{‘name‘: ‘python‘, ‘version‘: ‘2‘}

16 混合編寫
pattern = re.compile(r‘(?P<name>p[a-zA-Z]+)(?P<version>[0-9])‘)#公式
results = pattern.search(‘python2‘)#帶入
print (results.groupdict())
results = pattern.search(‘python3‘)
print (results.groupdict())
results = pattern.search(‘php4‘)
print (results.groupdict())
  #{‘name‘: ‘python‘, ‘version‘: ‘3‘}

17 字典循環
import re
text = ‘c++ python2 python3 perl ruby lua java javascript php4 php5 c‘
pattern = re.compile(r‘(?P<name>p[a-zA-Z]+)(?P<version>[0-9])‘)#公式
for t in text.split(‘ ‘):
results = pattern.search(t)
if results:
print (results.groupdict())
  #{‘name‘: ‘python‘, ‘version‘: ‘2‘}
  #{‘name‘: ‘python‘, ‘version‘: ‘3‘}
  #{‘name‘: ‘php‘, ‘version‘: ‘4‘}
  #{‘name‘: ‘php‘, ‘version‘: ‘5‘}

18 編譯字符re.X
a = re.compile(r"""\d + # 整數部分
\. # 小數點
\d * # 小數部分
""", re.X) #可以轉化成一行
b = re.compile(r"\d+\.\d*")


python 字符串之常用正則