非凡 发表于 2023-8-7 18:24:15

正则表达式中的一个疑惑——.match()


>>>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)),却又可以起到替换效果?

isdkz 发表于 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() 方法没有匹配到模式。

陶远航 发表于 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)方法来搜索整个字符串中所有匹配的项,并返回一个列表。希望能够解答你的问题,如果还有其他疑问,请随时提问。
如果问题已经解决,请设置最佳答案

学习编程中的Ben 发表于 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 re

a = "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))


输出:

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


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

如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 正则表达式中的一个疑惑——.match()