我知道\ 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()
答案 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);
,但是,因为它代表一个角色,所以它更容易扩充。