如何根据条件更改正则表达式中的量词?

时间:2015-02-08 14:03:26

标签: python regex python-2.7

我想找到长度为> = 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

1 个答案:

答案 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}}旁边没有小写字母。在这里它停止匹配,直到它找到一个连字符而不遵循小写字母。