python正则表达式re.sub的各个参数的详细解释⽂章⽬录
⼀、re.sub(pattern, repl, string, count=0, flags=0)
山地自行车品牌re是正则的表达式,sub是substitute,表⽰替换
re.sub共有五个参数。
re.sub(pattern, repl, string, count=0, flags=0)
其中三个必选参数:pattern, repl, string
两个可选参数:count, flags
⼆、参数讲解
1、pattern参数
pattern,表⽰正则中的模式字符串,这个没太多要解释的。
需要知道的是:
反斜杠加数字:\N,则对应着匹配的组:matched group
⽐如\6,表⽰匹配前⾯pattern中的第6个group
意味着,pattern中,前⾯肯定是存在对应的组,后⾯也才能去引⽤
举个例⼦
hello xinfa, nihao xinfa
我们想把xinfa替换成linxinfa,就可以这样:
import re
inputStr ="hello xinfa, nihao xinfa"
replacedStr = re.sub(r"hello (\w+), nihao \1","linxinfa", inputStr)
print("replacedStr = ", replacedStr)
#输出结果为: replacedStr = linxinfa
注意,上⾯的(\w+),括号括起来表⽰⼀个组;
⾥⾯的\w表⽰匹配字母、数字、下划线,等价于[A-Za-z0-9_];
然后+表⽰匹配前⾯的⼦表达式⼀次或多次。
所以(\w+)就是匹配多个字母、数字、下划线的意思。表达式中的\1表⽰匹配第⼀个组,第⼀个组就是(\w+)。
2、repl参数
repl,就是replacement,被替换的字符串的意思。
repl可以是字符串,也可以是函数。
2.1、repl是字符串
如果repl是字符串的话,其中的任何反斜杠转义字符,都会被处理。
⽐如:
\n:会被处理为对应的换⾏符;
\r:会被处理为回车符;
其他不能识别的转移字符,则只是被识别为普通的字符: ⽐如\j,会被处理为j这个字母本⾝;
⽐较特殊的是\g<n>,\g表⽰匹配组,n是组的id,⽐如\g<1>表⽰第⼀个组。王羲之十七帖
还是上⾯的例⼦,我们想把xinfa提取出来,只剩xinfa
hello xinfa, nihao xinfa
就可以这样写:
import re
inputStr ="hello xinfa, nihao xinfa"
replacedStr = re.sub(r"hello (\w+), nihao \1","\g<1>", inputStr)
print("replacedStr = ", replacedStr)
#输出结果为: replacedStr = xinfa
2.2、repl是函数
⽐如输⼊内容是:
hello 123 world 456
想要把其中的数字部分,都加上111,变成:
家用电焊机hello 234 world 567
那么就可以这样:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re;
def pythonReSubDemo():
"""
demo Pyton re.sub
"""
inputStr ="hello 123 world 456"
def_add111(matched):
intStr = up("number")
intValue =int(intStr)
addedValue = intValue +111
addedValueStr =str(addedValue)
return addedValueStr
replacedStr = re.sub("(?P<number>\d+)", _add111, inputStr)
print("replacedStr=",replacedStr)
金丝楠木种植
#输出结果为:replacedStr= hello 234 world 567
if __name__=="__main__":
pythonReSubDemo()
注意上⾯,⽤了⼀个?P<value>。
兄弟图片大全P<value>的意思就是命名⼀个名字为value的组,匹配规则符合后⾯的\d+。
遗忘的回忆3、string参数
string,即表⽰要被处理,要被替换的那个string字符串。
4、count参数
举例说明:
继续之前的例⼦,假如对于匹配到的内容,只处理其中⼀部分。
⽐如:
hello 123 world 456 nihao 789
我们只是想要处理前⾯两个数字:123,456,分别给他们加111,⽽不处理789,
那么就可以这样:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re;
def pythonReSubDemo():
"""
demo Pyton re.sub
"""
inputStr ="hello 123 world 456 nihao 789"
def_add111(matched):
intStr = up("number")
intValue =int(intStr)
addedValue = intValue +111
addedValueStr =str(addedValue)
return addedValueStr
replacedStr = re.sub("(?P<number>\d+)", _add111, inputStr,2)
print("replacedStr = ", replacedStr)
#输出结果为:replacedStr = hello 234 world 567 nihao 789
if __name__=="__main__":
pythonReSubDemo()
5、flags参数
flags是编译标志。编译标志让你可以修改正则表达式的⼀些运⾏⽅式。
在re模块中标志可以使⽤两个名字,⼀个是全名如IGNORECASE,⼀个是缩写,⼀字母形式如I。(如果你熟悉 Perl 的模式修改,⼀字母形式使⽤同样的字母;例如re.VERBOSE的缩写形式是re.X。)
多个标志可以通过按位或它们来指定。如re.I | re.M被设置成I和M标志。
下⾯列举下常⽤的编译标志。
西游记推荐语
5.1、IGNORECASE(简写I)
使匹配对⼤⼩写不敏感;
举个例⼦,[A-Z]也可以匹配⼩写字母,Spam可以匹配 Spam、spam或spAM。
5.2、LOCALE(简写L)
locales是C语⾔库中的⼀项功能,是⽤来为需要考虑不同语⾔的编程提供帮助的。
举个例⼦,如果你正在处理法⽂⽂本,你想⽤ w+来匹配⽂字,但w只匹配字符类[A-Za-z],它并不能匹配é。
如果你的系统配置适当且本地化设置为法语,那么内部的 C函数将告诉程序é也应该被认为是⼀个字母。
当在编译正则表达式时使⽤ LOCALE标志会得到⽤这些 C函数来处理 w后的编译对象,这会更慢,但也会象你希望的那样可以⽤w+来匹配法⽂⽂本。
5.3、MULTILINE(简写M)
MULTILINE多⾏的意思,改变 ^ 和 $ 的⾏为。
使⽤ ^只匹配字符串的开始,⽽ $则只匹配字符串的结尾和直接在换⾏前(如果有的话)的字符串结尾。
当本标志指定后,^匹配字符串的开始和字符串中每⾏的开始。同样的, $元字符匹配字符串结尾和字符串中每⾏的结尾(直接在每个换⾏之前)。
例如
import re
s='hello \nworld \nxinfa'
print(s)
pile(r'^\w+')
print(re.findall(pattern,s))
#加上flags=re.M
pile(r'^\w+', flags=re.M)
print(re.findall(pattern,s))
输出结果为
hello
world
xinfa
['hello']
['hello', 'world', 'xinfa']
5.4、DOTALL(简写S)
此模式下 .的匹配不受限制,可匹配任何字符,包括换⾏符,也就是默认是不能匹配换⾏符。例:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
s ='''first line
...: cond line
...: third line'''
pile('.+')
print(regex.findall(s))
pile('.+', re.S)
print(regex.findall(s))
输出结:
['first line', ' ...: cond line', ' ...: third line']
['first line\n ...: cond line\n ...: third line']
5.5、VERBOSE(简写X)
冗余模式, 此模式忽略正则表达式中的空⽩和#号的注释。
例:
email_regex = re.compile("[\w+\.]+@[a-zA-Z\d]+\.(com|cn)")
email_regex = re.compile("""[\w+\.]+ # 匹配@符前的部分
@ # @符
贫血食补[a-zA-Z\d]+ # 邮箱类别
\.(com|cn) # 邮箱后缀 """, re.X)