在Python中,人们可以很容易地检查另一个字符串内文本字符串的存在。但是,在某些情况下,我们可能没有完全匹配的文本。例如,如果要检查是否存在任何有效的电子邮件地址,该怎么办。这就是正则表达式发挥作用的地方。在本节中,我们将探讨正则表达式并了解各种正则表达式。
- 常用表达
- 为什么使用正则表达式
- 基本正则表达式
- 更多正则表达式
- 编译正则表达式
常用表达
正则表达式是基于预定义模式匹配文本的强大工具。它可以通过与特定模式匹配来检测文本的存在或不存在,还可以将模式分为一个或多个子模式。 Python标准库为正则表达式提供了re模块。它的主要函数是提供搜索,其中需要一个正则表达式和一个字符串。在这里,它要么返回第一个匹配项,要么不返回任何匹配项。
Python3
import re
match = re.search(r'portal', 'GeeksforGeeks: A computer science \
portal for geeks')
print(match)
print(match.group())
print('Start Index:', match.start())
print('End Index:', match.end())
Python3
import re
print(re.findall(r'[Gg]eeks', 'GeeksforGeeks: \
A computer science portal for geeks'))
Python3
import re
print('Range',re.search(r'[a-zA-Z]', 'x'))
Python3
import re
print(re.search(r'[^a-z]', 'c'))
Python3
import re
print(re.search(r'G[^e]', 'Geeks'))
Python3
import re
print('Geeks:', re.search(r'\bGeeks\b', 'Geeks'))
print('GeeksforGeeks:', re.search(r'\bGeeks\b', 'GeeksforGeeks'))
Python3
import re
# Beginning of String
match = re.search(r'^Geek', 'Campus Geek of the month')
print('Beg. of String:', match)
match = re.search(r'^Geek', 'Geek of the month')
print('Beg. of String:', match)
# End of String
match = re.search(r'Geeks$', 'Compute science portal-GeeksforGeeks')
print('End of String:', match)
Python3
import re
print('Any Character', re.search(r'p.th.n', 'python 3'))
Python3
import re
print('Color',re.search(r'colou?r', 'color'))
print('Colour',re.search(r'colou?r', 'colour'))
Python3
import re
print('Date{mm-dd-yyyy}:', re.search(r'[\d]{2}-[\d]{2}-[\d]{4}',
'18-08-2020'))
Python3
import re
print('Three Digit:', re.search(r'[\d]{3,4}', '189'))
print('Four Digit:', re.search(r'[\d]{3,4}', '2145'))
Python3
import re
print(re.search(r'[\d]{1,}','5th Floor, A-118,\
Sector-136, Noida, Uttar Pradesh - 201305'))
Python3
import re
print(re.search(r'[\d]+', '5th Floor, A-118,\
Sector-136, Noida, Uttar Pradesh - 201305'))
Python3
import re
grp = re.search(r'([\d]{2})-([\d]{2})-([\d]{4})', '26-08-2020')
print(grp)
Python3
import re
grp = re.search(r'([\d]{2})-([\d]{2})-([\d]{4})','26-08-2020')
print(grp.group())
Python3
import re
grp = re.search(r'([\d]{2})-([\d]{2})-([\d]{4})','26-08-2020')
print(grp.groups())
Python3
import re
grp = re.search(r'([\d]{2})-([\d]{2})-([\d]{4})','26-08-2020')
print(grp.group(3))
Python3
import re
match = re.search(r'(?P[\d]{2})-(?P[\d]{2})-(?P[\d]{4})',
'26-08-2020')
print(match.group('mm'))
Python3
import re
match = re.search(r'(?P[\d]{2})-(?P[\d]{2})-(?P[\d]{4})',
'26-08-2020')
print(match.groupdict())
Python3
import re
print('negation:', re.search(r'n[^e]', 'Python'))
print('lookahead:', re.search(r'n(?!e)', 'Python'))
Python3
import re
print('positive lookahead', re.search(r'n(?=e)', 'jasmine'))
Python3
import re
print(re.sub(r'([\d]{4})-([\d]{4})-([\d]{4})-([\d]{4})',r'\1\2\3\4',
'1111-2222-3333-4444'))
Python3
import re
regex = re.compile(r'([\d]{2})-([\d]{2})-([\d]{4})')
# search method
print('compiled reg expr', regex.search('26-08-2020'))
# sub method
print(regex.sub(r'\1.\2.\3', '26-08-2020'))
<_sre.SRE_Match object; span=(52, 58), match='portal'>
portal
Start Index: 52
End Index: 58
在这里,r字符(r’portal’)代表原始字符,而不是正则表达式。原始字符串与常规字符串略有不同,它不会将\字符解释为转义字符。这是因为正则表达式引擎将\字符用于其自身的转义目的。
group方法返回匹配的字符串,而start和end方法提供了开始和结束字符串索引。除此之外,它还有很多其他方法,我们将在后面讨论。
为什么使用正则表达式?
让我们花一点时间来理解为什么我们应该使用正则表达式。
- 数据挖掘:正则表达式是数据挖掘的最佳工具。通过使用预定义的模式进行检查,它可以有效地识别文本堆中的文本。一些常见的情况是从一堆文本中识别电子邮件,URL或电话。
- 数据验证:正则表达式可以完美验证数据。通过定义不同的模式集,它可以包括各种各样的验证过程。一些示例是验证电话号码,电子邮件等。
基本正则表达式
让我们了解一些基本的正则表达式。它们如下:
- 字符类
- 游骑兵
- 否定
- 捷径
- 字符串的开头和结尾
- 任何字符
字符类
字符类使您可以将单个字符集与可能的字符集进行匹配。您可以在方括号内提及一个字符类。让我们考虑一个区分大小写的单词的例子。
Python3
import re
print(re.findall(r'[Gg]eeks', 'GeeksforGeeks: \
A computer science portal for geeks'))
['Geeks', 'Geeks', 'geeks']
范围
范围提供了灵活性,可以借助范围模式(例如,数字范围(0到9),字符范围(A到Z)等等)来匹配文本。字符类中的连字符代表一个范围。
Python3
import re
print('Range',re.search(r'[a-zA-Z]', 'x'))
Range <_sre.SRE_Match object; span=(0, 1), match='x'>
否定
否定会反转字符类。它会查找匹配除了倒字符或范围中的字符类提到的倒字符。
Python3
import re
print(re.search(r'[^a-z]', 'c'))
None
在上述情况下,我们将字符类从a转换为z。如果我们尝试匹配上述范围内的字符,则正则表达式引擎将返回None。
让我们考虑另一个例子
Python3
import re
print(re.search(r'G[^e]', 'Geeks'))
None
在这里,它接受e后面跟在G后面的任何其他字符。
捷径
让我们讨论正则表达式引擎提供的一些快捷方式。
- \ w –匹配单词字符
- \ d –匹配数字字符
- \ s –匹配空格字符(空格,制表符,换行符等)
- \ b –匹配零长度字符
Python3
import re
print('Geeks:', re.search(r'\bGeeks\b', 'Geeks'))
print('GeeksforGeeks:', re.search(r'\bGeeks\b', 'GeeksforGeeks'))
Geeks: <_sre.SRE_Match object; span=(0, 5), match='Geeks'>
GeeksforGeeks: None
字符串的开头和结尾
^字符选择字符串的开头,$字符选择字符串。
Python3
import re
# Beginning of String
match = re.search(r'^Geek', 'Campus Geek of the month')
print('Beg. of String:', match)
match = re.search(r'^Geek', 'Geek of the month')
print('Beg. of String:', match)
# End of String
match = re.search(r'Geeks$', 'Compute science portal-GeeksforGeeks')
print('End of String:', match)
Beg. of String: None
Beg. of String: <_sre.SRE_Match object; span=(0, 4), match='Geek'>
End of String: <_sre.SRE_Match object; span=(31, 36), match='Geeks'>
任何字符
这 。字符表示方括号字符类之外的任何单个字符。
Python3
import re
print('Any Character', re.search(r'p.th.n', 'python 3'))
Any Character <_sre.SRE_Match object; span=(0, 6), match='python'>
更多正则表达式
其他一些正则表达式如下:
- 可选字符
- 重复
- 速记
- 分组
- 展望
- 代换
可选字符
正则表达式引擎允许您使用?指定可选字符。字符。它允许一个字符或字符类出现一次或不出现。让我们考虑一个带有替代拼写的单词示例-颜色或颜色。
Python3
import re
print('Color',re.search(r'colou?r', 'color'))
print('Colour',re.search(r'colou?r', 'colour'))
Color <_sre.SRE_Match object; span=(0, 5), match='color'>
Colour <_sre.SRE_Match object; span=(0, 6), match='colour'>
重复
重复使您可以重复相同的字符或字符类。考虑一个包含日,月和年的日期的示例。让我们使用正则表达式来标识日期(mm-dd-yyyy)。
Python3
import re
print('Date{mm-dd-yyyy}:', re.search(r'[\d]{2}-[\d]{2}-[\d]{4}',
'18-08-2020'))
Date{mm-dd-yyyy}: <_sre.SRE_Match object; span=(0, 10), match='18-08-2020'>
在这里,正则表达式引擎检查两个连续的数字。找到匹配项后,它将移至连字符。之后,它将检查接下来的两个连续数字,并重复该过程。
让我们讨论重复下的其他三个正则表达式。
重复范围
当您必须接受一种或多种格式时,重复范围非常有用。考虑一个场景,其中三个数字以及四个数字都被接受。让我们看一下正则表达式。
Python3
import re
print('Three Digit:', re.search(r'[\d]{3,4}', '189'))
print('Four Digit:', re.search(r'[\d]{3,4}', '2145'))
Three Digit: <_sre.SRE_Match object; span=(0, 3), match='189'>
Four Digit: <_sre.SRE_Match object; span=(0, 4), match='2145'>
开放式范围
在某些情况下,字符重复没有限制。在这种情况下,您可以将上限设置为不定式。一个常见的例子是匹配街道地址。我们来看一下
Python3
import re
print(re.search(r'[\d]{1,}','5th Floor, A-118,\
Sector-136, Noida, Uttar Pradesh - 201305'))
<_sre.SRE_Match object; span=(0, 1), match='5'>
速记
简写字符使您可以使用+字符指定一个或多个({1,}),使用*字符指定零个或多个({0,}。
Python3
import re
print(re.search(r'[\d]+', '5th Floor, A-118,\
Sector-136, Noida, Uttar Pradesh - 201305'))
<_sre.SRE_Match object; span=(0, 1), match='5'>
分组
分组是通过使用括号将表达式分成组的过程,它使您可以获取每个单独的匹配组。
Python3
import re
grp = re.search(r'([\d]{2})-([\d]{2})-([\d]{4})', '26-08-2020')
print(grp)
<_sre.SRE_Match object; span=(0, 10), match='26-08-2020'>
让我们看看它的一些功能。
返回整个比赛
re模块允许您使用group()方法返回整个匹配项
Python3
import re
grp = re.search(r'([\d]{2})-([\d]{2})-([\d]{4})','26-08-2020')
print(grp.group())
26-08-2020
返回匹配组的元组
您可以使用groups()方法返回包含单个匹配组的元组
Python3
import re
grp = re.search(r'([\d]{2})-([\d]{2})-([\d]{4})','26-08-2020')
print(grp.groups())
('26', '08', '2020')
检索单个组
将索引传递给组方法后,您只能检索单个组。
Python3
import re
grp = re.search(r'([\d]{2})-([\d]{2})-([\d]{4})','26-08-2020')
print(grp.group(3))
2020
为您的群组命名
re模块允许您命名组。让我们看一下语法。
Python3
import re
match = re.search(r'(?P[\d]{2})-(?P[\d]{2})-(?P[\d]{4})',
'26-08-2020')
print(match.group('mm'))
08
个人匹配作为字典
我们已经看到正则表达式如何提供单个组的元组。不仅元组,它还可以提供单个匹配项作为字典,其中每个组的名称充当字典键。
Python3
import re
match = re.search(r'(?P[\d]{2})-(?P[\d]{2})-(?P[\d]{4})',
'26-08-2020')
print(match.groupdict())
{'dd': '26', 'mm': '08', 'yyyy': '2020'}
展望
在否定字符类的情况下,如果一个字符不存在要检查的否定字符它不会匹配。我们可以通过超前来克服这种情况。它根据内容的存在或不存在来接受或拒绝匹配。
Python3
import re
print('negation:', re.search(r'n[^e]', 'Python'))
print('lookahead:', re.search(r'n(?!e)', 'Python'))
negation: None
lookahead: <_sre.SRE_Match object; span=(5, 6), match='n'>
如果匹配项后没有特定字符,则超前匹配也可以取消该匹配项的资格。这个过程被称为正向提前,可以通过简单地替换就可以实现!字符与字符=。
Python3
import re
print('positive lookahead', re.search(r'n(?=e)', 'jasmine'))
positive lookahead <_sre.SRE_Match object; span=(5, 6), match='n'>
代换
正则表达式可以替换字符串,并使用re.sub方法返回替换后的字符串。当您在将其存储到数据库之前要避免使用诸如/,-、.等字符时,此功能很有用。它包含三个参数:
- 正则表达式
- 替换字符串
- 正在搜索的源字符串
让我们看一下下面的替换代码–信用卡号中的字符。
Python3
import re
print(re.sub(r'([\d]{4})-([\d]{4})-([\d]{4})-([\d]{4})',r'\1\2\3\4',
'1111-2222-3333-4444'))
1111222233334444
编译正则表达式
Python正则表达式引擎可以使用compile函数返回已编译的正则表达式对象。该对象具有其搜索方法和子方法,开发人员可以在需要时重用它。
Python3
import re
regex = re.compile(r'([\d]{2})-([\d]{2})-([\d]{4})')
# search method
print('compiled reg expr', regex.search('26-08-2020'))
# sub method
print(regex.sub(r'\1.\2.\3', '26-08-2020'))
输出
compiled reg expr <_sre.SRE_Match object; span=(0, 10), match=’26-08-2020′>
26.08.2020
概括
正则表达式是用于数据挖掘和数据验证的强大工具。但是,只要有直接的解决方案,就应避免使用正则表达式。而且,当您必须处理复杂的结构(例如非平凡的文档格式)时,请尝试使用其他满足需求的库。