嗨,我需要匹配cola xx
中的:ca:cr:pr cola xx
,但是当cola xx
没有发生时,我也需要ca:cr:pr
。以:
开头的代码数量也可以不同,也可以是长度。
>>> string
':ca:cr:pr cola xx'
>>> re.findall("\w+", string)
['ca', 'cr', 'pr', 'cola', 'xx']
>>> re.findall(":\w+", string)
[':ca', ':cr', ':pr']
>>> re.findall("^(:\w+)", string)
[':ca']
我还试图使用lookbehinds(http://runnable.com/Uqc1Tqv_MVNfAAGN/lookahead-and-lookbehind-in-regular-expressions-in-python-for-regex),但不成功。
>>> re.findall(r"(\s\w+)(?!:)",string)
[' cola', ' xx']
>>> string="cola"
>>> re.findall(r"(\s\w+)(?!:)",string)
[]
即没有标签,只检测到cola
。
如何提高正则表达式按预期工作?
再一次所需的例子:
:c cola xx
- > cola xx
:ca:c cola xx
- > cola xx
:ca:cr:pr cola xx
- > cola xx
cola xx
- > cola xx
cola
- > cola
答案 0 :(得分:5)
如果我理解你的要求,我相信这样的事情应该有效:
(?<!:)\b\w+
在代码中:
results = re.findall(r'(?<!:)\b\w+', string)
答案 1 :(得分:0)
为什么不直接替换所有以冒号开头的单词?
result = re.sub(r":\w+\b", "", subject)
答案 2 :(得分:0)
希望这会起作用
re.findall("(?<!:)(\w+)", string)
答案 3 :(得分:0)
我做的事情如下:
(?<!:)\w+(?:\s\w+)?