📜  Python表达式

📅  最后修改于: 2021-05-20 08:15:01             🧑  作者: Mango

在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方法提供了开始和结束字符串索引。除此之外,它还有很多其他方法,我们将在后面讨论。

为什么使用正则表达式?

让我们花一点时间来理解为什么我们应该使用正则表达式。

  1. 数据挖掘:正则表达式是数据挖掘的最佳工具。通过使用预定义的模式进行检查,它可以有效地识别文本堆中的文本。一些常见的情况是从一堆文本中识别电子邮件,URL或电话。
  2. 数据验证:正则表达式可以完美验证数据。通过定义不同的模式集,它可以包括各种各样的验证过程。一些示例是验证电话号码,电子邮件等。

基本正则表达式

让我们了解一些基本的正则表达式。它们如下:

  • 字符类
  • 游骑兵
  • 否定
  • 捷径
  • 字符串的开头和结尾
  • 任何字符

字符类

字符类使您可以将单个字符集与可能的字符集进行匹配。您可以在方括号内提及一个字符类。让我们考虑一个区分大小写的单词的例子。

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'))

输出

概括

正则表达式是用于数据挖掘和数据验证的强大工具。但是,只要有直接的解决方案,就应避免使用正则表达式。而且,当您必须处理复杂的结构(例如非平凡的文档格式)时,请尝试使用其他满足需求的库。