介绍:正则表达式用于识别给定的字符(字符串)序列中是否存在某种模式(pattern)。它们有助于处理文本数据,这通常是涉及文本挖掘的数据科学项目的先决条件。您一定遇到过正则表达式的一些应用:在服务器端用于验证注册时电子邮件地址或密码的格式,解析文本数据文件以查找、替换或删除某些字符串等。What:Regularexpressions非常强大,在本教程中,您将学习在Python中使用它们。您将涵盖以下主题:Python中的正则表达式基本字符:常见字符通配符:特殊字符使用正则表达式重复分组贪婪与非贪婪匹配rePython库---search()和match()Python正则表达式导入re模块在Python中,re模块支持正则表达式。使用以下命令导入此模块:Importrebasicpatterns:ordinarycharacters您可以使用普通字符轻松解析Python中的许多基本模式。普通字符是最简单的正则表达式。它们完全匹配并且在正则表达式语法中没有特殊含义。例如“A”、“a”、“X”、“5”。可以使用普通字符进行简单的精确匹配:>>>Importre>>>pattern=r"Cookie">>>sequence="Cookie">>>ifre.match(pattern,sequence):>>>print("Match!")>>>else:>>>print("Notamatch!")Match!match()如果文本与模式匹配,则此函数返回一个匹配对象。否则返回无。不过现在,让我们关注普通角色!你注意到Cookie开头的r模式了吗?这称为原始字符串文字。它改变了字符串文字的解释方式。此类文本在出现时存储。例如,当前缀为a,r而不是被解释为转义序列时,\只是一个反斜杠。你会看到特殊字符的含义。有时语法涉及反斜杠转义字符,为了防止这些字符被解释为转义序列,请使用原始r前缀。在此示例中您并不真正需要它,但为了保持一致性使用它是一种很好的做法。通配符:特殊字符特殊字符是不匹配正则表达式但在正则表达式中使用时实际上具有特殊含义的字符。最广泛使用的特殊字符是:.-匹配除换行符之外的任何单个字符。re.search(r'Co.k.e','Cookie').group()'Cookie'group()函数返回匹配re.稍后您将更详细地看到此功能。\w-小写w。匹配任何单个字母、数字或下划线。re.search(r'Co\wk\we','Cookie').group()'Cookie'\W-大写w。匹配任何不是\w(小写w)的字符。re.search(r'C\Wke','C@ke').group()'C@ke'\s-小写s。匹配单个空白字符,例如:空格、换行符、制表符、返回值。re.search(r'Eat\scake','Eatcake').group()'Eatcake'\S-大写s。匹配任何不是\s(小写s)的字符。re.search(r'Cook\Se','Cookie').group()'Cookie'\t-小写t。匹配标签。re.search(r'Eat\tcake','Eatcake').group()'Eat\tcake'\n-小写字母n。匹配换行符。\r-小写字母r。比赛回来了。\d-小写字母d。匹配十进制数字0-9。re.search(r'c\d\dkie','c00kie').group()'c00kie'^-caret匹配字符串开头的模式。re.search(r'^Eat','Eatcake').group()'Eat'$-匹配字符串末尾的模式。re.search(r'cake$','Eatcake').group()'cake'[abc]-匹配a或b或c。[a-zA-Z0-9]-匹配(a到z)或(A到Z)或(0到9)中的任何字母。不在范围内的字符可以通过补充集合来匹配。如果集合的第一个字符是^,则匹配所有不在集合中的字符。re.search(r'Number:[0-6]','Number:5').group()'Number:5'#Matchesanycharacterexcept5re.search(r'Number:[^5]','Number:0').group()'Number:0'\A-大写字母a。仅匹配字符串的开头。也可以跨多行工作。re.search(r'\A[A-E]ookie','Cookie').group()'Cookie'\b-小写字母b。仅匹配单词的开头或结尾。re.search(r'\b[A-E]ookie','Cookie').group()'Cookie'\-反斜杠。如果反斜杠后面的字符是可识别的转义字符,则采用该术语的特殊含义。例如,\n被视为换行符。但是,如果后面的字符\不是可识别的转义字符,则\会像其他任何字符一样处理并通过。让我们看几个例子:#Thischecksfor'\'inthestringinsteadof'\t'duetothe'\'usedre.search(r'Back\\stail','Back\stail').group()'Back\\stail'#Thistreats'\s'anascapecharacterbecauseitlacks'\'atthestartof'\s're.search(r'Back\stail','Backtail').group()'Backlash'repetitions如果你正在寻找序列中的长模式,这就变得非常无聊的。幸运的是,re模块处理具有以下特殊字符的重复:+-检查其左侧的一个或多个字符。re.search(r'Co+kie','Cooookie').group()'Cooookie'*-检查左侧的零个或多个字符。#Checksforanyoccurrenceofaoroorbothinthegivensequencere.search(r'Ca*o*kie','Caokie').group()'Caokie'?-检查它的左边是零还是一个字符。#Checksforexactlyzerooroneoccurrenceofaoroorbothinthegivensequencere.search(r'Colou?r','Color').group()'Color'但是如果你想检查序列重复的确切数量怎么办?例如,检查应用程序中电话号码的有效性。re模块还使用以下正则表达式很好地处理了这个问题:{x}-重复x次。{x,}-至少重复x次或更多次。{x,y}-至少重复x次,但不超过y次。re.search(r'\d{9,10}','0987654321').group()'0987654321'将+和*限定符视为贪婪。当您验证电子邮件地址并希望分别检查用户名和主机时,使用正则表达式进行分组和分组假设。这是组正则表达式功能派上用场的时候。它允许您选择部分匹配文本。由圆括号()分隔的正则表达式模式的部分称为组。括号不会改变表达式匹配的内容,而是在匹配序列中形成组。在本教程的所有示例中,您一直在使用group()函数。match.group()和往常一样,没有任何参数的纯文本仍然是整个匹配文本。email_address='Pleasecontactusat:support@datacamp.com'match=re.search(r'([\w\.-]+)@([\w\.-]+)',____________)if_____:print(匹配。group())#Thewholematchedtextprint(match.group(1))#Theusername(group1)print(match.group(2))#Thehost(group2)贪心vs非贪心匹配特殊字符匹配搜索序列时(string)尽可能匹配时,称为“贪心匹配”。这是正则表达式的正常行为,但有时并不需要:pattern="cookie"sequence="Cakeandcookie"heading=r'
