-
group(0) 就等于group()
是匹配的整体结果,第一个小括号里面的匹配是从group(1)
开始算起的 -
\w
匹配 匹配非特殊字符,即a-z
、A-Z
、0-9
、_
、汉字
,但是.
是匹配任意字符,除了换行符,当re.DOTALL
标记被指定时,则可以匹配包括换行符的任意字符,因为我们的匹配中要匹配.
所以不使用\w
with open(FILEPATH,'r') as file:
for index,line in enumerate(file):
lineSearch=re.search("/a/\[/r/(.+)/,/c/en/(.+)/.*,/c/en/(.+)/\]",line)
if lineSearch!=None and lineSearch.group(1)!=None and lineSearch.group(2)!=None:
print(lineSearch.group(2),' ',lineSearch.group(3))
使用懒惰匹配+?
或者'*?'
目的是匹配到第一个字符就终止,比如下面例子中因为懒惰匹配后面是一个/
所以他匹配到第一个/
就停止了,所以是懒惰匹配。如果不加?
是贪婪匹配他会匹
/(.+?)/.*
re.DOTALL的用法
- 当我们需要希望使用
.
来匹配任意字符时,但是.
是不能匹配换行符'\n'
的,因此可以设置flag=re.DOTALL
来匹配换行符.
import re
comment = re.compile(r'/\*(.*?)\*/') # 匹配C的注释
text1 = '/* this is a comment */'
text2 = """/*this is a
multiline comment */"""
comment.findall(text1)
Out[4]: [' this is a comment ']
comment.findall(text2) # 由于text2文本换行了,没匹配到
Out[5]: []
- 解决方法一:添加对换行符的支持,
(?:.|\n)
指定了一个非捕获组(即,这个组只做匹配但不捕获结果,也不会分配组号)
comment = re.compile(r'\*((?:.|\n)*?)\*/')
comment.findall(text2)
Out[7]: ['this is a \n multiline comment ']
- 解决方法二:设置
flag=re.DOTALL
使得.
可以用来匹配换行符
comment = re.compile(r'/\*(.*?)\*/', flags=re.DOTALL)
comment.findall(text2)
Out[10]: ['this is a \n multiline comment ']
?: ?= ?<
- 前瞻: 查找
exp2
前面的exp1
exp1(?=exp2)
- 后顾:查找
exp2
后面的exp1
(?<=exp2)exp1
- 负前瞻:查找后面不是
exp2
的exp1
exp1(?!exp2)
- 负后顾:查找前面不是
exp2
的exp1
(?<!=exp2)exp1
- 例子:这个应用经常见,比如我们要匹配被这个格式保卫的目标字符串
<start>字符串<end>
>>> m = re.search(r'(?<=-)\w+', 'spam-egg')
>>> m.group(0)
'egg'
-
?:
是匹配但是不捕获结果
一些函数的用法
-
re.search()
因为可能匹配不到,所以一般要判断一下
str = 'an example word:cat!!'
match = re.search(r'word:\w\w\w', str)
if match:
print 'found', match.group() ## 'found word:cat'
else:
print 'did not find'
>>> found word:cat
-
[]
类似于or
match = re.search(r'[\w.-]+@[\w.-]+',string)
if match:
print match.group()
>>> alice-b@gmail.com
-
findall
:返回的是a list of tuples
str = 'purple alice@google.com, blah monkey bob@abc.com blah dishwasher'
tuples = re.findall(r'([\w\.-]+)@([\w\.-]+)', str)
print tuples # [('alice', 'google.com'), ('bob', 'abc.com')]
for tuple in tuples:
print tuple[0] # username
print tuple[1] # host
>>> [('alice', 'google.com'), ('bob', 'abc.com')]
alice
google.com
bob
abc.com
-
re.sub
:re.sub(pat, replacement, str)
在str
里寻找和pat
匹配的字符串,然后用replacement
替换。replacement
可以包含\1
或者\2
来代替相应的group
,然后实现局部替换。
# replace hostname
str = 'alice@google.com, and bob@abc.com'
#returns new string with all replacements,
# \1 is group(1), \2 group(2) in the replacement
print re.sub(r'([\w\.-]+)@([\w\.-]+)', r'\1@yo-yo-dyne.com', str)
>>> alice@yo-yo-dyne.com, and bob@yo-yo-dyne.com
速记表
-
元字符不匹配自己,若想匹配自己要加上转义字符。
正则表达式字符串前面的
-
Python
中字符串前面加上r
表示原生字符串。
与大多数编程语言相同,正则表达式里使用"\"
作为[转义字符],这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\"
,那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\"
:前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,匹配一个数字的"\\d"
可以写成r"\d"
。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。