使用Python正则表达式匹配所有不以':'开头的单词

1 投票
4 回答
1688 浏览
提问于 2025-04-18 11:51

你好,我需要从 :ca:cr:pr cola xx 中提取出 cola xx,同时也希望在没有 ca:cr:pr 的情况下能获取到 cola xx。以 : 开头的标签数量和长度可能会有所不同。

>>> 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']

我尝试使用回顾查找(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

4 个回答

0

我会这样做:

(?<!:)\w+(?:\s\w+)?
0

为什么不直接把所有以冒号开头的词都替换成空白呢?

result = re.sub(r":\w+\b", "", subject)
0

希望这个能奏效

re.findall("(?<!:)(\w+)", string)
5

我觉得如果我理解你的需求没错的话,像这样的代码应该可以工作:

(?<!:)\b\w+

这是一个正则表达式的演示

在代码中:

results = re.findall(r'(?<!:)\b\w+', string)

撰写回答