我正在学习Regular Expressions,所以对于一个简单的问题表示歉意。正则表达式 - 如何选择一个有' - '的单词?
我想选择有一个词 - 它而不是在开始,而不是在单词的末尾
我尝试(使用的findAll)(减号)“”:
r'\b-\b'
为
str = 'word semi-column peace'
但是,当然只得到了:
['-']
谢谢!
我正在学习Regular Expressions,所以对于一个简单的问题表示歉意。正则表达式 - 如何选择一个有' - '的单词?
我想选择有一个词 - 它而不是在开始,而不是在单词的末尾
我尝试(使用的findAll)(减号)“”:
r'\b-\b'
为
str = 'word semi-column peace'
但是,当然只得到了:
['-']
谢谢!
一个 ' - '(减号)中,但在开始时没有和不是在字
结束由于"-"
是不一个字字符,则不能使用单词边界(\b
)防止在开始或结束时使用带连字符的单词进行匹配。像"-not-wanted-"
这样的字符串将匹配\b\w+-\w+\b
和\w+-\w+
。
我们需要前后单词后多加一个条件:
(?<![-\w])
没有任何一个连字号,也不是一个单词字符开头。(?![-\w])
没有后跟连字符或单词字符。此外,一个词可能有超过1个连字符,我们需要允许它。我们可以在这里做的是一次重复这个词的最后部分(“字号和字字符”)或以上:
\w+(?:-\w+)+
比赛:
\w+
一个或多个单词字符(?:-\w+)+
一连字符和一个或多个单词字符,并允许重复最后一部分。正则表达式:
(?<![-\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)
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']
的解释总是欢迎:) –
@LetzerWilie - 谢谢!如果不是用词来表达:“2.2 -3.5-beta”?它会工作吗(意思是,正则表达式会忽略这个表达)?另外,词的定义(从我收集的内容)可以稍微改变一个正则表达式实现到另一个。有没有办法解决这个问题? – Toly
你可以试试这样:以连字符为中心,我匹配,直到从连字符的任一方向出现一个空格为止,我也检查这些单词是否被连字符包围(例如-test-cats- ),如果他们是我确保不包括他们。正则表达式也应该与findall一起使用。
st = 'word semi-column peace'
m = re.search(r'([^ | ^-]+-[^ | ^-]+)', st)
if m:
print m.group(1)
另一种创造性的方法!谢谢你们! – Toly
您也可以使用下面的正则表达式:
>>> st = "word semi-column peace"
>>> print re.findall(r"\S+\-\S+", st)
['semi-column']
我好地方来测试真正的正则表达式,而不必运行的代码是http://pythex.org/ – reticentroot