2015-10-14 68 views
2

我正在学习Regular Expressions,所以对于一个简单的问题表示歉意。正则表达式 - 如何选择一个有' - '的单词?

我想选择有一个词 - 它而不是在开始,而不是在单词的末尾

我尝试(使用的findAll)(减号)“”:

r'\b-\b' 

str = 'word semi-column peace' 

但是,当然只得到了:

['-'] 

谢谢!

+0

我好地方来测试真正的正则表达式,而不必运行的代码是http://pythex.org/ – reticentroot

回答

3

一个 ' - '(减号)中,但在开始时没有不是在字

结束由于"-"一个字字符,则不能使用单词边界(\b)防止在开始或结束时使用带连字符的单词进行匹配。像"-not-wanted-"这样的字符串将匹配\b\w+-\w+\b\w+-\w+


我们需要前后单词后多加一个条件:

  • 之前:(?<![-\w])没有任何一个连字号,也不是一个单词字符开头。
  • 之后:(?![-\w])没有后跟连字符或单词字符。

此外,一个词可能有超过1个连字符,我们需要允许它。我们可以在这里做的是一次重复这个词的最后部分(“字号和字字符”)或以上:

  • \w+(?:-\w+)+比赛:
    • \w+一个或多个单词字符
    • (?:-\w+)+一连字符和一个或多个单词字符,并允许重复最后一部分。

正则表达式:

(?<![-\w])\w+(?:-\w+)+(?![-\w]) 

regex101 demo

代码:

import re 

pattern = re.compile(r'(?<![-\w])\w+(?:-\w+)+(?![-\w])') 
text = "-abc word semi-column peace -not-wanted- one-word dont-match- multi-hyphenated-word" 

result = re.findall(pattern, text) 

ideone demo

+0

非常全面! – Toly

+0

正如任何正则表达式应该是:) – Mariano

+0

如果有表达式会发生什么?例如,而不是“半列”有“2.0 - 3 -alpha”,这仍然工作(它会忽略表达)? – Toly

4
str is a built in name, better not to use it for naming 

st = 'word semi-column peace' 
# \w+ word - \w+ word after - 
print(re.findall(r"\b\w+-\w+\b",st)) 

['semi-column'] 
+3

的解释总是欢迎:) –

+0

@LetzerWilie - 谢谢!如果不是用词来表达:“2.2 -3.5-beta”?它会工作吗(意思是,正则表达式会忽略这个表达)?另外,词的定义(从我收集的内容)可以稍微改变一个正则表达式实现到另一个。有没有办法解决这个问题? – Toly

4

你真正想做的是像这样的正则表达式:

\w+-\w+ 

这意味着什么是找到一个字母数字字符至少一次指示由“+”的利用率,然后找到一个' - ',再次至少一次跟随另一个字母数字字符,如'+'所示。

+0

谢谢!很好的解释! – Toly

+0

非常欢迎! – idjaw

0

你可以试试这样:以连字符为中心,我匹配,直到从连字符的任一方向出现一个空格为止,我也检查这些单词是否被连字符包围(例如-test-cats- ),如果他们是我确保不包括他们。正则表达式也应该与findall一起使用。

st = 'word semi-column peace' 
m = re.search(r'([^ | ^-]+-[^ | ^-]+)', st) 
if m: 
    print m.group(1) 
+0

另一种创造性的方法!谢谢你们! – Toly

1

您也可以使用下面的正则表达式:

>>> st = "word semi-column peace" 
>>> print re.findall(r"\S+\-\S+", st) 
['semi-column']