Python 正则表达式-如何选择包含“-”的单词?

Python 正则表达式-如何选择包含“-”的单词?,python,regex,findall,Python,Regex,Findall,我正在学习正则表达式,所以我为一个简单的问题道歉 我想选择其中有“-”减号的单词,但不在单词的开头和结尾 我尝试使用findall: r'\b-\b' 为了 但是,当然只有: ['-'] 谢谢大家! 您实际上想要做的是这样一个正则表达式: 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.f

我正在学习正则表达式,所以我为一个简单的问题道歉

我想选择其中有“-”减号的单词,但不在单词的开头和结尾

我尝试使用findall:

r'\b-\b'
为了

但是,当然只有:

['-']

谢谢大家!

您实际上想要做的是这样一个正则表达式:

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']
\w+-\w+

这意味着,如“+”所示,至少查找一个字母数字字符一次,然后再查找一个“-”,然后再查找另一个字母数字字符至少一次,再次,如“+”所示。

您可以尝试以下操作:以连字符为中心,我进行匹配,直到连字符的任意方向都有一个空格,我还要检查单词是否被连字符包围,例如-test cats-如果是,我确保不包括它们。正则表达式也应该与findall一起使用

st = 'word semi-column peace'
m = re.search(r'([^ | ^-]+-[^ | ^-]+)', st)
if m:
    print m.group(1)
一个'-'减号,但不在单词的开头和结尾

由于-不是单词字符,因此不能使用单词边界\b来阻止在字符的结尾或结尾使用连字符的单词进行匹配。类似-not want-的字符串将同时匹配\b\w+-\w+\b和\w+-\w+

我们需要在单词前后添加一个额外的条件:

之前:?前面既没有连字符也没有单词字符。 之后:?![-\w]后面不跟连字符或单词字符。 此外,一个单词中可能有多个连字符,我们需要允许它。我们可以在这里重复一次或多次连字符和单词字符的最后一部分:

\w+?:-\w++匹配: \w+一个或多个单词字符 ?:-\w++一个连字符和一个或多个单词字符,并允许重复最后一部分。 正则表达式:

代码:


您还可以使用以下正则表达式:

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

非常感谢。很好的解释!我认为,不必像任何正则表达式那样运行代码就可以真正测试正则表达式:如果有表达式,会发生什么?例如,不是半列而是2.0-3-alpha,这仍然有效吗?它将忽略表达式?它将不匹配,因为连字符周围有空格,但如果删除空格,它将匹配。如果要排除数字,请将主\w更改为[a-zA-Z]另一种创造性方法!谢谢大家!@LetzerWilie-谢谢你!如果有一个表达式代替了单词:2.2-3.5-beta?它也能正常工作吗?意思是,正则表达式会忽略这个表达式吗?另外,我收集的单词的定义可以稍微改变一个正则表达式实现到另一个正则表达式实现。有办法解决这个问题吗?
(?<![-\w])\w+(?:-\w+)+(?![-\w])
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)
>>> st = "word semi-column peace"
>>> print re.findall(r"\S+\-\S+", st)
['semi-column']