你能简单地解释一下Python正则表达式语法吗
在本博客中,您将学习正则表达式(RegEx)并使用Python的re模块与之交互(通过示例)。
正则表达式(RegEx)是定义搜索模式的字符序列。例如,
^a...s $
上面的代码定义了一个RegEx模式。任何以a和s结尾的五个字母字符串都形成该模式。
Python有一个名为re的模块,可用于处理RegEx。以下是一个示例−
import re
pattern = '^a...s$'
test_string = 'abyss'
result = re.match(pattern, test_string)
if result:
print("Search successful.")
else:
print("Search unsuccessful.")
用于这些操作的不同类型的语法
re.findall()
re.findall()方法返回一个包含所有匹配项的字符串列表。
示例
从字符串中提取数字的程序
import re
string = 'hello 12 hi 89. Howdy 34'
pattern = '\d+'
print("Entered String=",string)
result = re.findall(pattern, string)
print("The numbers in the above string",result)
输出
Entered String= hello 12 hi 89. Howdy 34
The numbers in the above string ['12', '89', '34']
如果找不到模式,则re.findall()返回一个空列表。
re.search()
re.search()方法接受两个参数:模式和字符串。该方法查找RegEx模式产生字符串匹配的第一个位置。
如果搜索成功,则re.search()返回匹配对象;否则,它将返回None。
字符串
match = re.search(pattern, str)
示例
import re
string = "Python is fun"
#检查'Python'是否在开头
match = re.search('\APython', string)
if match:
print("pattern found inside the string")
else:
print("pattern not found")
输出
pattern found inside the string
这里,match包含一个匹配对象。
re.subn()
re.subn()类似于re.sub(),除了它返回一个包含新字符串和替换数的2个项目的元组。
示例
#程序以删除所有空格为例
import re
#多行字符串
string = 'abc 12\
de 23 \n f45 6'
print("Orginal String =",string)
#匹配所有空白字符
pattern = '\s+'
#空字符串
replace = ''
new_string = re.subn(pattern, replace, string)
print("New String=",new_string)
输出
Orginal String = abc 12de 23
f45 6
New String= ('abc12de23f456', 4)
re.split()
re.split 在分割具有匹配项的字符串后提供一个字符串列表。
示例
import re
string = 'Twelve:12 Eighty nine:89.'
pattern = '\d+'
result = re.split(pattern, string)
print(result)
输出
['Twelve:', ' Eighty nine:', '.']
如果找不到模式,则re.split()返回包含原始字符串的列表。
您可以将maxsplit参数传递给re.split()方法。它是将发生的最大拆分次数。
示例
import re
string = 'Twelve:12 Eighty nine:89 Nine:9.'
pattern = '\d+'
//maxsplit = 1
//仅在第一次出现时进行拆分
result = re.split(pattern, string, 1)
print(result)
输出
['Twelve:', ' Eighty nine:89 Nine:9.']
顺便说一下,maxsplit的默认值为0;意味着所有可能的分割。
re.sub()
re.sub()的语法是-
re.sub(pattern, replace, string)
该方法返回一个字符串,其中匹配的出现替换为replace变量的内容。
示例
#程序以删除所有空格为例
import re
#多行字符串
string = 'abc 12\ de 23 \n f45 6'
#匹配所有空白字符
pattern = '\s+'
#空字符串
replace = ''
new_string = re.sub(pattern, replace, string)
print(new_string)
输出
abc12\de23f456
如果找不到模式,则re.sub()返回原始字符串。
您可以将count作为第四个参数传递给re.sub()方法。如果省略,结果为0。这将替换所有出现次数。
示例
import re
#多行字符串
string = "abc 12\
de 23 \n f45 6"
#匹配所有空白字符
pattern = '\s+'
replace = ''
new_string = re.sub(r'\s+', replace, string, 1)
print(new_string)
输出
abc12de 23
f45 6
匹配对象
您可以使用dir()函数获取匹配对象的方法和属性。
一些常用的匹配对象方法和属性是−
match.group()
group()方法返回有匹配的字符串部分。
示例
import re
string = '39801 356, 2102 1111'
#三位数字后跟空格后跟两位数字
pattern = '(\d{3}) (\d{2})'
#match变量包含一个Match对象。
match = re.search(pattern, string)
if match:
print(match.group())
else:
print("pattern not found")
输出
801 35
这里,match变量包含一个匹配对象。
我们的模式(\d{3})(\d{2})有两个子组(\d{3})和(\d{2})。您可以获取这些括号化子组的字符串部分。以下是方法−
>>> match.group(1)
'801'
>>> match.group(2)
'35'
>>> match.group(1, 2)
('801', '35')
>>> match.groups()
('801', '35')
match.start(),match.end()和match.span()
# start()函数返回匹配的子字符串的开始索引。同样,end()返回匹配的子字符串的结束索引。
>>> match.start()
2
>>> match.end()
8
# span()函数返回一个元组,其中包含匹配部分的开始和结束索引。
>>> match.span()
(2, 8)
# match.re和match.string
# 匹配对象的re属性返回正则表达式对象。同样,string属性返回传递的字符串。
>>> match.re
re.compile('(\d{3}) (\d{2})')
>>> match.string
'39801 356, 2102 1111'
我们已经涵盖了re模块中定义的所有常用方法。如果您想了解更多,请访问Python 3 re模块。
在正则表达式之前使用r前缀
当在正则表达式之前使用r或R前缀时,它表示原始字符串。例如,’\n’是换行符,而r’\n’表示两个字符:反斜杠\后跟n。
反斜线\用于转义各种字符,包括所有元字符。但是,使用r前缀可以使\作为普通字符处理。
示例
import re
string = '\n and \r are escape sequences.'
result = re.findall(r'[\n\r]', string)
print(result)
输出
['\n', '\r']
结论
因此,这些是我们尝试使用一些引人入胜的示例来解释的最基本和关键的正则表达式概念。其中一些是虚构的,但大多数是我们在清理数据时遇到的真实问题,因此,如果您将来遇到问题,请再次查看示例;您可能会在那里找到解决方案。