Python正则表达式用于连字符单词

16

我正在寻找一个能够匹配Python中连字符单词的正则表达式。

我最接近的尝试是:'\w+-\w+[-w+]*'

text = "one-hundered-and-three- some text foo-bar some--text"
hyphenated = re.findall(r'\w+-\w+[-\w+]*',text)

该函数返回列表['one-hundered-and-three-', 'foo-bar']

这个函数几乎完美,除了在'three'后面有一个多余的连字符。我只想要在'word'后面跟着一个额外的连字符。即,我需要像'(-\w+)*'这样的东西,而不是'[-\w+]\*'。我曾经以为它会起作用,但事实并非如此(它返回['-three, ''])。也就是说,我需要一个匹配|单词或连字符后跟一个单词后跟连字符和单词零次或多次|的正则表达式。


2
我不知道您计划将其用于何处,但您是否考虑过带有前缀或后缀连字符是有效的的情况,例如“十九和二十世纪”或“投资者拥有和运营”? - Lauritz V. Thaulow
1
你自己的表达式中主要问题在于方括号。它们不是用来将内容分组的,而是创建一个字符类,这是完全不同的东西。 - stema
感谢您的输入,lazyr。我已经考虑了您指出的情况,它们不会造成问题。感谢您的澄清,stema。我意识到方括号没有将内容分组,但它们导致了我尝试做的最接近匹配。 - Sixhobbits
1个回答

31

试一下这个:

re.findall(r'\w+(?:-\w+)+',text)

在这里,我们认为连字号单词是指:

  • 一些字母字符
  • 后跟任意数量的:
    • 一个连字符
    • 后跟字母字符

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接