Python RE表示单词的结尾\b是否有用

Python RE表示单词的结尾\b是否有用,python,regex,Python,Regex,我理解\b可以表示单词的开头或结尾。何时需要\b来表示结束?我这样问是因为似乎总是需要有\s来表示单词的结尾,因此不需要有\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

我理解\b可以表示单词的开头或结尾。何时需要\b来表示结束?我这样问是因为似乎总是需要有\s来表示单词的结尾,因此不需要有\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()

\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
捕捉单词的结尾,结果却丢失了大部分。

\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
捕捉单词结尾,结果会丢失大部分结尾。

考虑匹配单词“march”:

它可以出现在句子的结尾

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

您可能会想,“但是我可以使用
r'\s+march\s+'
获得所有这些东西”,您是对的。。。区别在于什么匹配。使用
\s+
,您还可能在匹配中包含一些空格(因为这就是
\s+
的意思)。这会使某些事情变得更加困难,例如搜索一个单词并替换它,因为您可能必须设法使空格与以前保持一致。

考虑匹配单词“march”:

它可以出现在句子的结尾

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

您可能会想,“但是我可以使用
r'\s+march\s+'
获得所有这些东西”,您是对的。。。区别在于什么匹配。使用
\s+
,您还可能在匹配中包含一些空格(因为这就是
\s+
的意思)。这会使某些事情变得更加困难,比如搜索一个单词并替换它,因为你可能必须设法使空格与以前保持一致。

这不是因为它在单词的末尾,而是因为你知道单词后面的内容。在您的示例中:

m = re.search(r'(\b\w+\b)\s+\1', 'Cherry tree blooming will begin in in later March')
m = re.search(r'(\b\w+)\s+\1\b', "Let's go to the theater")
…第一个
\b
是防止以
begin
中的
开始的匹配所必需的。第二个是多余的,因为您显式地匹配单词后面的非单词字符(
\s+
)。单词边界是指你不知道另一边的角色是什么,甚至不知道那里是否有角色的情况

您应该在正则表达式末尾使用另一个正则表达式。例如:

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

如果没有第二个
\b
,您将得到剧院
的假阳性

这不是因为它在单词的末尾,而是因为你知道单词后面是什么。在您的示例中:

m = re.search(r'(\b\w+\b)\s+\1', 'Cherry tree blooming will begin in in later March')
m = re.search(r'(\b\w+)\s+\1\b', "Let's go to the theater")
"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
是防止以
begin
中的
开始的匹配所必需的。第二个是多余的,因为您显式地匹配单词后面的非单词字符(
\s+
)。单词边界是指你不知道另一边的角色是什么,甚至不知道那里是否有角色的情况

您应该在正则表达式末尾使用另一个正则表达式。例如:

m = re.search(r'(\b\w+\b)\s+\1', 'Cherry tree blooming will begin in in later March')
m = re.search(r'(\b\w+)\s+\1\b', "Let's go to the theater")
如果没有第二个
\b
,您将得到剧院
的假阳性

"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运算符

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

如果“\b”代表一个单词的边界,那么单词let's将变成两个单词“let”和“s”。也要考虑像先生和夫人那样失去他们的时期。< /P> 同样,如果“\b”代表一个单词的开头,那么在这些情况下,appostrophe将丢失:“twas”bout“cause”

连字符的单词在“\b”手上也会受苦,例如岳母(除非你想让她受苦。)

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

当使用自然语言时,
\b
操作符非常适合快速原型化想法,但最终可能不是您想要的。同上,但是,因为它代表一个字符,所以它更容易扩充

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

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

这意味着它确实如此