Python RE,对于指示单词的结尾是有用的

时间:2016-04-10 19:09:19

标签: python regex

我知道\ b可以表示单词的开头或结尾。何时需要代表结束?我问,因为似乎总是需要指示单词的结尾,因此不需要\ b。就像下面的情况一样,一个用'\ b'来结束内组,另一个没有,并且它们得到相同的结果。

m = re.search(r'(\b\w+\b)\s+\1', 'Cherry tree blooming will begin in in later March')
print m.group()

m = re.search(r'(\b\w+)\s+\1', 'Cherry tree blooming will begin in in later March')
print m.group()

4 个答案:

答案 0 :(得分:2)

\s只是空白。您可以使用不是空格(标点符号等)的字边界,这是您需要使用\b时的边界。如果您只匹配由空格分隔的单词,则可以使用\s;在这种情况下,您不需要\b

import re

sentence = 'Non-whitespace delimiters: Commas, semicolons; etc.'
print(re.findall(r'(\b\w+)\s+', sentence))
print(re.findall(r'(\b\w+\b)+', sentence))

产地:

['whitespace']
['Non', 'whitespace', 'delimiters', 'Commas', 'semicolons', 'etc']

请注意,仅使用\s尝试捕获单词结尾的方式最终会丢失大部分内容。

答案 1 :(得分:2)

考虑想要匹配“march”这个词:

>>> regex = re.compile(r'\bmarch\b')

它可以在句末结束......

>>> regex.search('I love march')
<_sre.SRE_Match object at 0x10568e4a8>

或者刚开始......

>>> regex.search('march is a great month')
<_sre.SRE_Match object at 0x10568e440>

但如果我不想匹配marching之类的内容,那么字边界最方便:

>>> regex.search('my favorite pass-time is marching')
>>>

你可能会想“但是我可以使用r'\s+march\s+'来获得所有这些东西”并且你是对的......不同之处在于匹配。使用\s+,您也可能在匹配中包含一些空格(因为这是\s+的含义)。这可以使某些事情变得像搜索单词并更换它更困难,因为您可能需要管理保持空白与之前的空白一致。

答案 2 :(得分:1)

这不是因为它出现在单词的最后,而是因为你知道单词后面的内容是什么。在您的示例中:

m = re.search(r'(\b\w+\b)\s+\1', 'Cherry tree blooming will begin in in later March')

...第一个\b是防止以in中的begin开头的匹配所必需的。第二个是多余的,因为您明确匹配单词后面的非单词字符(\s+)。字边界适用于您不知道另一边的字符是什么,或者即使在那里会有字符的情况。

应该使用另一个的地方是在正则表达式的末尾。例如:

m = re.search(r'(\b\w+)\s+\1\b', "Let's go to the theater")

如果没有第二个\b,您将获得the theater的误报。

答案 3 :(得分:0)

"I understand that \b can represent either the beginning or the end of a word. When would \b be required to represent the end?"

\b绝不是必需来表示单词的结尾或开头。要回答你更大的问题,它只在开发过程中有用 - 当使用自然语言时,你最终需要用其他东西替换\b。为什么呢?

\ b运算符匹配您发现的单词边界。但这里的一个关键概念是“什么是?”答案是非常狭窄的集合[A-Za-z0-9_] - 单词不是自然语言单词,而是计算机语言标识符。 \ b运算符存在于正式语言的解析器中。

这意味着它无法处理常见的自然语言情况,如:

单词 let's 成为两个单词,'let'&amp; 's'如果`\ b'代表一个单词的边界。还要考虑像先生这样的头衔。 &安培; 太太失去了他们的时间。

同样,如果`\ b'代表一个单词的开头,那么这些情况下的近似将会丢失:'twas'回合'原因

连词也受到'\ b'的影响,例如婆婆(除非你想让她受苦。)

不幸的是,您不能简单地通过将\b包含在字符集中来扩充\b,因为它不代表字符。您可以通过零宽度断言中的交替将其与其他字符组合。

使用自然语言时,\w运算符非常适合快速构建原型,但最终可能不是您想要的。同上char buf[size]; read(fs,buf,size); ,但是,因为它代表一个角色,所以它更容易扩充。