为什么我的带连字符的正则表达式不起作用?

时间:2013-12-31 23:13:26

标签: python regex

我正在编写一个正则表达式,用于使用python的re模块与简单单词和单个带连字符的单词进行匹配,例如在:

test_case_input = """the wide-field infrared survey explorer is a nasa
infrared-wavelength space telescope in an earth-orbiting satellite which
performed an all-sky astronomical survey. be careful of -tricky tricky-
hyphens --- be precise."""

应匹配:

test_case_output = ['the', 'wide-field', 'infrared', 'survey', 'explorer',
'is', 'a', 'nasa', 'infrared-wavelength', 'space', 'telescope', 'in', 'an',
'earth-orbiting', 'satellite', 'which', 'performed', 'an', 'all-sky',
'astronomical', 'survey', 'be', 'careful', 'of', 'tricky', 'tricky',
'hyphens', 'be', 'precise']

我找到了一个匹配单个带连字符的正则表达式: r“[az] + - [az] +”,另一个用于简单单词 r“[az] +”< / strong>然后我尝试使用或 r“[az] + - [az] + | [az] +”,但输出错误:

[' wide', ' infrared', ' survey', ' explorer', ' is', ' a', ' nasa', 
'infrared-wavelength ', ' telescope', ' in', ' an', ' earth', ' satellite',
 ' which', ' an', ' all', ' astronomical', ' survey', ' be', ' careful', ' of',
 ' tricky', ' be', ' precise']

如果我使用gruops: r“(:?[az] + - [az] +)|(:?[az] +)”两者都没有,我认为另一个解决方案工作 r“[az] +(:? - [az] +)?”也没有。

这显然是可能的,但有些事我不清楚。怎么了?

3 个答案:

答案 0 :(得分:3)

您可以使用:

r'[a-z]+(?:-[a-z]+)*'

答案 1 :(得分:2)

有几件事:

  1. 您的正则表达式需要由分隔符*锚定,或者您将匹配部分单词,就像现在的情况一样
  2. 您没有为非捕获组使用正确的语法。这是(?:而不是(:?
  3. 如果您解决了第一个问题,则根本不需要群组。

    *即字符串的空白或开头/结尾。

答案 2 :(得分:1)

这个正则表达式应该这样做。

\b[a-z]+-[a-z]+\b

\b表示字边界。