当前位置: 首页 > 科技观察

Python正则表达式教程:常用文本处理技巧

时间:2023-03-13 23:26:50 科技观察

介绍:正则表达式用于识别给定的字符(字符串)序列中是否存在某种模式(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'

TITLE

're.match(r'<.*>',heading).group()'

TITLE

'模式<.*>匹配整个字符串,直到第二次出现>。但是,如果只想匹配第一个标记,可以使用贪心限定符*?,它会匹配尽可能少的文字。添加?在限定符导致它以非贪婪或最小的方式执行匹配之后;也就是说,将匹配尽可能少的字符。当运行<.*>时,你只会匹配

。heading=r'

TITLE

're.match(r'<.*?>',heading).group()'

'rePython库RePython中的库提供了几个函数,使得值得掌握。您已经看到了其中的一些,re.search()、re.match()。让我们详细研究一些有用的函数:search(pattern,string,flags=0)使用此函数,您可以扫描给定的字符串/序列,寻找正则表达式产生匹配项的第一个位置。如果找到,则返回对应的匹配对象;否则,如果字符串中没有位置与模式匹配,则返回None。请注意,None与在字符串中的某个点找到零长度匹配项不同。pattern="cookie"sequence="Cakeandcookie"re.search(pattern,sequence).group()'cookie'match(pattern,string,flags=0)如果字符串开头的零个或多个字符匹配模式,返回相应的匹配对象。否则,如果字符串与给定模式不匹配,则返回None。pattern="C"sequence1="IceCream"#Nomatchsince"C"isnotatthestartof"IceCream"re.match(pattern,sequence1)sequence2="Cake"re.match(pattern,sequence2).group()'C'search()与match()不同,match()函数仅在字符串的开头检查匹配项(默认情况下),而search()函数检查字符串中任意位置的匹配项。findall(pattern,string,flags=0)在整个序列中查找所有可能的匹配并将它们作为字符串列表返回。每个返回的字符串代表一个匹配项。email_address="Pleasecontactusat:support@datacamp.com,xyz@datacamp.com"#'addresses'isalistthatstoresallthepossiblematchaddresses=re.findall(r'[\w\.-]+@[\w\.-]+',email_address)foraddressinaddresses:print(address)support@datacamp.comxyz@datacamp.comsub(pattern,repl,string,count=0,flags=0)这是替代函数。它返回通过替换或替换字符串中最左边的非重叠模式而获得的字符串repl。如果未找到模式,则字符串将原封不动地返回。email_address="Pleasecontactusat:xyz@datacamp.com"new_email_address=re.sub(r'([\w\.-]+)@([\w\.-]+)',r'support@datacamp.com',email_address)print(new_email_address)Pleasecontactusat:support@datacamp.comcompile(pattern,flags=0)将正则表达式模式编译成正则表达式对象。当您需要在单个程序中多次使用一个表达式时,使用compile()函数保存生成的正则表达式对象以供重用会更高效。这是因为compile()缓存了传递给模块级匹配函数的最新模式的编译版本。pattern=re.compile(r"cookie")sequence="Cakeandcookie"pattern.search(sequence).group()'cookie'#Thisiseequivalentto:re.search(pattern,sequence).group()'cookie'提示:是的通过指定标志值修改表达式的行为。您可以将标志作为额外参数添加到您在本教程中看到的各种函数。使用的一些标志是:IGNORECASE、DOTALL、MULTILINE、VERBOSE等。案例研究:使用正则表达式现在您已经通过一些示例了解了正则表达式在Python中的工作原理,是时候动手了!在本案例研究中,您将运用所学知识。importreimportrequeststhe_idiot_url='https://www.gutenberg.org/files/2638/2638-0.txt'defget_book(url):#SendsahttprequesttogetthetextfromprojectGutenbergraw=requests.get(url).text#Discardsthemetadatafromthebeginningofthebookstart=re.search(r"\*\*\*STARTOFTHISPROJECTGUTENBERGEBOOK.*\*\*\*",raw).end()#Discardsthemetadatafromtheendofthebookstop=re.search(r"II",raw).start()#Keepstherelevanttexttext=raw[开始:停止]returntextdefpreprocess(sentence):returnre.sub('[^A-Za-z0-9.]+','',sentence).lower()book=get_book(the_idiot_url)processed_book=preprocess(book)print(processed_book)在语料库中找出代词“the”的数字。提示:使用len()函数。len(re.findall(r'the',processed_book))302尝试将语料库中“i”的每个独立实例转换为“I”。确保不要更改单词中“i”的出现次数:processed_book=re.sub(r'\si\s',"I",processed_book)print(processed_book)查找“”语料库中某人出现的次数引用().len(re.findall(r'\"',book))96语料库中'--'连接的词是什么?re.findall(r'[a-zA-Z0-9]*--[a-zA-Z0-9]*',book)['ironical--it','malicious--smile','fur--or',------------省略]恭喜结束!您已经完成了Python正则表达式教程!使用Python,您的数据科学之旅将涉及更多内容。正则表达式可以在数据预处理阶段发挥重要作用。