我想找到长度为> = 1的单词,其中可能包含'
或-
。这是一个测试字符串:
a quake-prone area- (aujourd'hui-
在Python中,我目前正在使用这个正则表达式:
string = "a quake-prone area- (aujourd'hui-"
RE_WORDS = re.compile(r'[a-z]+[-\']?[a-z]+')
words = RE_WORDS.findall(string)
我想得到这个结果:
>>> words
>>> [u'a', u'quake-prone', u'area', u"aujourd'hui"]
但我得到了这个:
>>> words
>>> [u'quake-prone', u'area', u"aujourd'hui"]
不幸的是,由于上一个+
量词,它会跳过所有长度为1的字。如果我使用*
量词,它会找到a
,但也会area-
而不是area
。
然后如何创建条件正则表达式:if the word contains an apostrophe or an hyphen, use the + quantifier else use the * quantifier
?
答案 0 :(得分:1)
我建议您将最后一个[-\']?[a-z]+
部分更改为可选项,方法是将其放入一个组中,然后在该组旁边添加一个?
量词。
>>> string = "a quake-prone area- (aujourd'hui-"
>>> RE_WORDS = re.compile(r'[a-z]+(?:[-\'][a-z]+)?')
>>> RE_WORDS.findall(string)
['a', 'quake-prone', 'area', "aujourd'hui"]
为什么不打印a
的原因是因为你的正则表达式包含两个[a-z]+
,它声称匹配中必须至少有两个小写字母。
请注意,我提到的正则表达式与area-
不匹配,因为(?:[-\'][a-z]+)?
可选组声明必须至少有一个小写字母才会出现在-
符号之后。如果不是,则停止匹配,直到它到达连字符。因此,area
输出area-
而不是-
,因为{{1}}旁边没有小写字母。在这里它停止匹配,直到它找到一个连字符而不遵循小写字母。