我正在使用Python的re
模块捕获Am中单词color
的所有修饰词。英语(AmE)和Br。英文(BrE)。我成功捕获了几乎所有单词,但以撇号结尾的单词除外。例如。 colors'
这个问题来自Watt的Beginning Reg Exp书。
以下是示例文本:
Red is a color.
His collar is too tight or too colouuuurful.
These are bright colours.
These are bright colors.
Calorific is a scientific term.
“Your life is very colorful,” she said.
color (U.S. English, singular noun)
colour (British English, singular noun)
colors (U.S. English, plural noun)
colours (British English, plural noun)
color’s (U.S. English, possessive singular)
colour’s (British English, possessive singular)
colors’ (U.S. English, possessive plural)
colours’ (British English, possessive plural)
这是我的正则表达式:\bcolou?r(?:[a-zA-Z’s]+)?\b
说明:
\b # Start at word boundary
colou?r #u is optional for AmE
(?: #non-capturing group
[a-zA-Z’s]+ #color could be followed by modifier (e.g.ful, or apostrophe)
)? #End non-capturing group; these letters are optional
\b # End at word boundary
问题是colors’
和colours’
一直匹配到s
。撇号被忽略。有人可以解释我的代码有什么问题吗?我在SO Regex Apostrophe how to match?上进行了研究,发现了与转义'
和"
有关的问题。
这里是Regex101
谢谢。
答案 0 :(得分:2)
问题在于\b
是一个单词边界,而对于...lors’
,’
与以下空格之间的位置是 not 一个单词边界,因为’
和空格都不是单词字符。代替\b
,可以使用前瞻来表示空格,句点,逗号或之后可能发生的其他情况:
\bcolou?r(?:[a-zA-Z’s]+)?(?=[ .,])
答案 1 :(得分:0)
问题在于结尾\b
。从定义上说
\ b在一个字符之间立即匹配而不消耗任何字符 \ w匹配的字符和\ w不匹配的字符 订购)。不能将非单词与单词分开。
’
不在\w
组中。
尝试删除结尾的内容:\bcolou?r(?:[a-zA-Z’s]+)?