迪士尼彩乐园开发

迪士尼彩乐园3下载 正则抒发式透顶指南: 从基础到实战哄骗

点击次数:72 发布日期:2025-01-30 21:26

手脚别称数据科学家,您时时会遭遇零七八碎的非结构化文本数据。在分析这些数据之前,您需要对其进行计帐、索要相干信息并将其调遣为结构化样子。这恰是正则抒发式的用武之地。

将正则抒发式(regex)视为一种成心用于刻画文本模式的袖珍谈话。一朝掌持了中枢办法,您就能用短短几行代码履行复杂的文本操作,而使用范例字符串智力则需要数十行代码。

GitHub上的代码贯串。您还不错稽查这个快速参考的正则抒发式表格。

正则抒发式念念维模式

掌持正则抒发式的重要在于开发正确的念念维模式。从施行上讲,正则抒发式仅仅一个从左到右遍历文本、试图寻找匹配项的模式。

今年10月,七国集团领导人就以俄罗斯被冻结资产所产生的收益作为抵押、向乌克兰提供500亿美元贷款达成共识,承诺将在今年底前向乌方提供贷款,用于支持乌方财政、军事和重建。作为七国集团贷款计划的一部分,美国承诺将向乌克兰发放200亿美元贷款。

联想您正在书中寻找特定模式。您逐页扫描,寻找该模式。这基本上即是正则抒发式的责任道理——它一一字符地扫描文本,查验面前位置是否匹配您的模式。

让咱们从导入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']

量词:指定重迭

平凡,您会想匹配重迭出现的模式。量词让您不错指定字符或组应该出现的次数。让咱们查找所有电话号码,不管它们是否使用连字符:

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等用具渐渐稽查模式匹布风物

使用样本数据测试:创建涵盖不同场景的小测试用例

举例,要是您尝试匹配电话号码但模式不起作用,请先尝试仅匹配区号,然后渐渐添加更多组件。

转头

正则抒发式是数据科学汉文本处理的强大用具。它们允许您:

从非结构化文本中索要结构化信息

计帐和范例化不一致的数据样子

凭证特定模式考证数据

通过复杂的搜索和替换操作调遣文本

请记着,正则抒发式是一项跟着期间发展的妙技。不要试图记着每个元字符和手艺——违抗,专注于贯串基本原则,并按期使用果真天下的数据问题进行训练。

迪士尼彩乐园3下载

热点资讯

最新资讯