动作别称数据科学家,您常常会遭受横三竖四的非结构化文本数据。在分析这些数据之前,您需要对其进行计帐、提真金不怕火运筹帷幄信息并将其治疗为结构化体式。这恰是正则抒发式的用武之地。
将正则抒发式(regex)视为一种有利用于描述文本形状的袖珍谈话。一朝掌抓了中枢倡导,您就能用短短几行代码实践复杂的文本操作,而使用设施字符串要领则需要数十行代码。
GitHub上的代码贯串。您还不错观看这个快速参考的正则抒发式表格。
正则抒发式想维形状
掌抓正则抒发式的要津在于设站立确的想维形状。从本体上讲,正则抒发式仅仅一个从左到右遍历文本、试图寻找匹配项的形状。
遐想您正在书中寻找特定形状。您逐页扫描,寻找该形状。这基本上等于正则抒发式的职责旨趣——它一一字符地扫描文本,查验面前位置是否匹配您的形状。
让咱们从导入Python内置的re模块启动:
import re
1. 字面字符:构建您的第一个正则抒发式形状
最肤浅的正则抒发式形状匹配精准的文本。如若您想在文本中查找单词"data",不错使用:
text = "Data science is cool as you get to work with real-world data"matches = re.findall(r"data", text)print(matches)
珍视,这只找到了小写的"data",而忽略了开端大写的"Data"。
输出 >>> ['data']
默许情况下,正则抒发式区别大小写。这给咱们带来了第一课:要明确指定您想匹配的内容。
matches = re.findall(r"data", text, re.IGNORECASE)print(matches)
输出 >>> ['Data', 'data']
字符串前边的r暗示"原始字符串"。这在正则抒发式中很进攻,因为反斜杠用于罕见序列,而原始字符串不错堤防Python阐述这些反斜杠。
2. 元字符:卓绝字面匹配
使正则抒发式有用的是它使用元字符界说形状的智商。这些罕见字符的预料超出了它们的字面暗示。
通配符:点号(.)
点号匹配除换行符外的任何字符。当您知谈形状的一部分但不细目其他部分时,这终点有用:
text = "The cat sat on the mat. The bat flew over the rat."pattern = r"The ... "matches = re.findall(pattern, text)print(matches)
这里,咱们查找"The"后跟轻易三个字符和一个空格。
输出 >>> ['The cat ', 'The bat ']
点号荒谬巨大,但巧合过于巨大——它能匹配任何内容!这等于字符类弘扬作用的方位。
字符类:使用[]进行特定匹配
字符类允许您界说要匹配的一组字符:
text = "The cat sat on the mat. The bat flew over the rat."pattern = r"[cb]at"matches = re.findall(pattern, text)print(matches)
此形状查找"cat"或"bat"——聚首[cb]中的任何字符后跟"at"。
输出 >>> ['cat', 'bat']
当某个位置可能出现存限的一组字符时,字符类是无缺的礼聘。
您还不错在字符类中使用规模:
# 查找统统以a-d开端的小写单词pattern = r"\b[a-d][a-z]*\b"text = "apple banana cherry date elephant fig grape kiwi lemon mango orange"matches = re.findall(pattern, text)print(matches)
这里,\b暗示单词规模(稍后会留神先容),[a-d]匹配从a到d的任何小写字母,[a-z]*匹配零个或多个小写字母。
输出 >>> ['apple', 'banana', 'cherry', 'date']
量词:指定重叠
平方,AG真人百家乐靠谱吗您会想匹配重叠出现的形状。量词让您不错指定字符或组应该出现的次数。让咱们查找统统电话号码,不管它们是否使用连字符:
text = "Phone numbers: 555-1234, 555-5678, 5551234"pattern = r"\b\d{3}-?\d{4}\b"matches = re.findall(pattern, text)print(matches)
这会赢得以下效果:
输出 >>> ['555-1234', '555-5678', '5551234']
阐明这个形状:
\b确保咱们在单词规模处
\d{3}精准匹配3位数字
-?匹配零个或一个连字符(?使连字符可选)
\d{4}精准匹配4位数字
\b确保咱们在另一个单词规模处
这比编写多个形状或复杂的字符串操作来处理不同体式要优雅得多。
3. 锚点:在特定位置查找形状
巧合您只想在文本中的特定位置查找形状。锚点不错匡助竣事这极少:
text = "Python is popular in data science."# ^锚定到字符串开端start_matches = re.findall(r"^Python", text)print(start_matches)# $锚定到字符串收尾end_matches = re.findall(r"science\.$", text)print(end_matches)
这输出:
['Python'] ['science.']
锚点不匹配字符;它们匹配位置。这关于考证像电子邮件地址这么的体式荒谬有用,其中特定元素必须出当今开端或收尾。
4. 拿获组:提真金不怕火特定部分
在数据科学中,您平方不仅想找到形状——还想提真金不怕火这些形状的特定部分。用圆括号创建的拿获组让您不错作念到这极少:
text = "Dates: 2023-10-15, 2022-05-22"pattern = r"(\d{4})-(\d{2})-(\d{2})"# findall复返拿获组的元组matches = re.findall(pattern, text)print(matches) # 您不错使用这些创建结构化数据for year, month, day in matches: print(f"Year: {year}, Month: {month}, Day: {day}")
这是输出:
[('2023', '10', '15'), ('2022', '05', '22')] Year: 2023, Month: 10, Day: 15 Year: 2022, Month: 05, Day: 22
这关于从非结构化文本中提真金不怕火结构化信息终点有匡助,这是数据科学中的常见任务。
5. 定名组:使正则抒发式更易读
关于复杂形状,记着每个组拿获的内容可能具有挑战性。定名组处罚了这个问题:
这会给出:
Username: john.doe Domain: example.com
定名组使您的正则抒发式更自文档化且更易于珍贵。
处理信得过数据:实践示例
让咱们望望正则抒发式怎样驾御于常见的数据科学任务。
示例1:计帐杂沓数据
假定您有一个产物代码不一致的数据集:
product_codes = [ "PROD-123", "Product 456", "prod_789", "PR-101", "p-202"]
您想设施化这些代码以仅提真金不怕火数字部分:
cleaned_codes = []for code in product_codes: # 仅提真金不怕火数字部分 match = re.search(r"\d+", code) if match: cleaned_codes.append(match.group)print(cleaned_codes)
输出:
['123', '456', '789', '101', '202']
这比编写多个字符串操作来处理不同体式要干净得多。
示例2:从文本中提真金不怕火信息
假定您有客户作事日记并需要提真金不怕火信息:
log = "ISSUE #1234 [2023-10-15] Customer reported app crash on iPhone 12, iOS 15.2"
您不错使用正则抒发式提真金不怕火结构化数据:
# 提真金不怕火问题编号、日历、斥地和操作系统版块pattern = r"ISSUE #(\d+) \[(\d{4}-\d{2}-\d{2})\].*?(iPhone \d+).*?(iOS \d+\.\d+)"match = re.search(pattern, log)if match: issue_num, date, device, ios_version = match.groups print(f"Issue: {issue_num}") print(f"Date: {date}") print(f"Device: {device}") print(f"iOS Version: {ios_version}")
输出:
Issue: 1234 Date: 2023-10-15 Device: iPhone 12 iOS Version: iOS 15.2
示例3:数据考证
正则抒发式关于考证数据体式很有用:
def validate_email(email): """考证电子邮件体式,并阐述其有用或无效的原因""" pattern = r"^[\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$" if not re.match(pattern, email): # 查验具体问题 if '@' not in email: return False, "艰难@标识" username, domain = email.split('@', 1) if not username: return False, "用户名为空" if '.' not in domain: return False, "域名无效(艰难顶级域名)" return False, "电子邮件体式无效" return True, "有用的电子邮件"
当今用不同的电子邮件测试:
输出:
此函数不仅考证电子邮件,还阐述它们有用或无效的原因,这比肤浅的真/假效果更有用。
高档技艺:卓绝基础正则抒发式
跟着您对正则抒发式越来越熟识,您会遭受基本形状不够用的情况。以下是一些高档技艺:
前瞻和后顾
这些是"零宽度断言",查验形状是否存在而不将其包含在匹配中:
# 密码考证password = "Password123"has_uppercase = bool(re.search(r"(?=.*[A-Z])", password))has_lowercase = bool(re.search(r"(?=.*[a-z])", password))has_digit = bool(re.search(r"(?=.*\d)", password))is_long_enough = len(password) >= 8if all([has_uppercase, has_lowercase, has_digit, is_long_enough]): print("密码合适条目")else: print("密码不合适统统条目")
输出:
密码合适条目
前瞻(?=.*[A-Z])查验字符串中是否有大写字母,而空虚际拿获它。
非贪念匹配
量词默许是"贪念的",意味着它们尽可能多地匹配。在量词后添加?使其变为"非贪念":
text = "First contentSecond content"# 贪念匹配(默许)greedy = re.findall(r"(.*)", text)print(f"贪念: {greedy}") # 非贪念匹配non_greedy = re.findall(r"(.*?)", text)print(f"非贪念: {non_greedy}")
输出:
贪念: ['First content
Second content'] 非贪念: ['First content', 'Second content']
贯穿贪念和非贪念匹配之间的区别关于领路嵌套结构(如HTML或JSON)是必要的。
学习和调试正则抒发式
在学习正则抒发式时:
从字面匹配启动:在添加复杂性之前匹配精准字符串
添加字符类:学习匹配字符类别
掌抓量词:贯穿重叠形状
使用拿获组:提真金不怕火结构化数据
学习锚点和规模:轨则形状的匹配位置
探索高档技艺:前瞻、非贪念匹配等
要津是继续学习——勤俭单的启动,然后字据需要逐步学习其他内容。
当您的正则抒发式不按预期职责时:
阐明它:测试更肤浅的形状版块以窒碍问题
可视化:使用regex101.com等器具逐步观看形状匹配样式
使用样本数据测试:创建涵盖不同场景的小测试用例
举例,如若您尝试匹配电话号码但形状不起作用,请先尝试仅匹配区号,然后逐步添加更多组件。
追想
正则抒发式是数据科学汉文本处理的巨大器具。它们允许您:
从非结构化文本中提真金不怕火结构化信息
计帐和设施化不一致的数据体式
字据特定形状考证数据
通过复杂的搜索和替换操作治疗文本
请记着,正则抒发式是一项跟着时刻发展的手段。不要试图记着每个元字符和技艺——相背,专注于贯穿基本原则,并依期使用信得过天下的数据问题进行锻真金不怕火。
百家乐ag