鱼C论坛

 找回密码
 立即注册
查看: 2150|回复: 3

[已解决]正则表达式中的一个疑惑——.match()

[复制链接]
发表于 2023-8-7 18:24:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
>>>import re
>>>a = r"swordfish I don't want to be someone that you're settling word for. I don't want to be someone that anyone settles for word"
>>>p = re.compile(r'\bword\b')
>>>m = p.match(a)
>>>print(m)
None
>>>print(p.sub('deed',a))
swordfish I don't want to be someone that you're settling deed for. I don't want to be someone that anyone settles for deed

为什么输出m,是个None,如果输出是个None不是说明上面那段正则没有匹配到字符吗?



print(p.sub('deed',a)),却又可以起到替换效果?
最佳答案
2023-8-7 18:24:36
在正则表达式中,match()方法尝试从字符串的开头开始匹配模式。如果匹配成功,则返回一个匹配对象;如果匹配失败,则返回None

对于你提供的示例代码中的正则表达式 \bword\b,它使用了单词边界\b来匹配独立的单词"word"。该正则表达式要求"word"必须是一个完整的单词,即前后不能有其他字符。

在你的字符串中,有两个包含"word"的单词,分别是"settling word"和"for word"。然而,这两个单词都不是字符串的开头,因此match()方法无法匹配成功。因此,m的值为None

而当你使用sub()方法时,它会查找整个字符串并将所有匹配到的模式替换为指定的内容。在这种情况下,你使用p.sub('deed', a)将字符串中的所有"word"替换为"deed"。这种替换是全局的,所以所有匹配到的地方都会被替换。

所以,print(p.sub('deed', a))的输出将替换所有匹配到的"word"为"deed"后的新字符串。

以下是修改后的完整代码示例:
import rea = "swordfish I don't want to be someone that you're settling word for. I don't want to be someone that anyone settles for word"p = re.compile(r'\bword\b')m = p.match(a)print(m)print(p.sub('deed', a))
输出:
[/code]
None
swordfish I don't want to be someone that you're settling deed for. I don't want to be someone that anyone settles for deed
[/code]

注意:如果你希望在整个字符串中查找模式并返回匹配对象,可以使用search()方法代替match()方法。

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-7 18:24:27 | 显示全部楼层
在正则表达式中, match() 方法是用来从字符串的开头开始匹配模式。如果模式没有从字符串的开头匹配成功, match() 方法会返回 None 。

在你的代码中,正则表达式 p 定义为 \bword\b ,它会匹配单词"word"。然而,在字符串 a 中,"word"出现在句子的中间和末尾,而不是开头。因此, p.match(a) 返回 None 。

另一方面, sub() 方法用于在字符串中替换匹配到的模式。在你的代码中, p.sub('deed', a) 会将字符串 a 中所有匹配到的"word"替换为"deed",并返回替换后的字符串。

所以, p.sub('deed', a) 能够起到替换效果,而 m 为 None 是因为 match() 方法没有匹配到模式。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-7 18:24:31 | 显示全部楼层
你的理解是正确的。在正则表达式中,.match()方法用于尝试从字符串的开头匹配模式,如果匹配成功,则返回一个正则匹配对象;如果不匹配,则返回None

在你的示例代码中,使用p.match(a)进行匹配时,模式\bword\b表示匹配单词"word",但它只会从字符串的开头进行匹配。你的字符串"a"以"word"开头,因此匹配成功,但如果字符串开头没有"word",那么match()将无法匹配成功,返回None

另一方面,p.sub('deed',a)用于将字符串中匹配到的部分替换为指定的内容。在你的示例中,模式\bword\b匹配到了两个"word",并使用"deed"替换了所有的匹配项。所以,输出的替换结果是将所有的"word"替换为"deed"的字符串。

需要注意的是,.sub()方法是全局替换,而.match()只匹配开头。如果你想要从整个字符串中搜索所有的匹配项,可以使用.findall()方法来实现。示例代码如下:
import re

a = r"swordfish I don't want to be someone that you're settling word for. I don't want to be someone that anyone settles for word"
p = re.compile(r'\bword\b')
m = p.findall(a)
print(m)  # 输出: ['word', 'word']

replaced = p.sub('deed', a)
print(replaced)  # 输出: swordfish I don't want to be someone that you're settling deed for. I don't want to be someone that anyone settles for deed

在上述代码中,使用了p.findall(a)方法来搜索整个字符串中所有匹配的项,并返回一个列表。希望能够解答你的问题,如果还有其他疑问,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-7 18:24:36 | 显示全部楼层    本楼为最佳答案   
在正则表达式中,match()方法尝试从字符串的开头开始匹配模式。如果匹配成功,则返回一个匹配对象;如果匹配失败,则返回None

对于你提供的示例代码中的正则表达式 \bword\b,它使用了单词边界\b来匹配独立的单词"word"。该正则表达式要求"word"必须是一个完整的单词,即前后不能有其他字符。

在你的字符串中,有两个包含"word"的单词,分别是"settling word"和"for word"。然而,这两个单词都不是字符串的开头,因此match()方法无法匹配成功。因此,m的值为None

而当你使用sub()方法时,它会查找整个字符串并将所有匹配到的模式替换为指定的内容。在这种情况下,你使用p.sub('deed', a)将字符串中的所有"word"替换为"deed"。这种替换是全局的,所以所有匹配到的地方都会被替换。

所以,print(p.sub('deed', a))的输出将替换所有匹配到的"word"为"deed"后的新字符串。

以下是修改后的完整代码示例:
import rea = "swordfish I don't want to be someone that you're settling word for. I don't want to be someone that anyone settles for word"p = re.compile(r'\bword\b')m = p.match(a)print(m)print(p.sub('deed', a))
输出:
[/code]
None
swordfish I don't want to be someone that you're settling deed for. I don't want to be someone that anyone settles for deed
[/code]

注意:如果你希望在整个字符串中查找模式并返回匹配对象,可以使用search()方法代替match()方法。

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 09:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表