python正则表达式匹配组中的一个或多个字符,特殊备选方案除外

时间:2013-12-23 19:14:09

标签: python regex python-2.7

除了<>=/*+-=之外,我想匹配=>的所有组合。我怎么能这样做?

 r = re.compile(r'[<>=/*+-]+')

这匹配集合中的一个或多个字符,但我不知道如何阻止它匹配==>模式。我猜它与负向前瞻或者后视有关,但是我很难绕过它。


澄清:我确实希望匹配<>=/*+-中除==>之外的所有字符组合。换句话说,我想找到仅包含这些字符的最大长度连续子串 - 如果子串等于==>,则不应将其视为匹配。

我为之前没有澄清而道歉,但这似乎是一个简单的问题陈述,不需要额外的澄清。

示例案例:

  • pow pow -> bah bah包含匹配->
  • a +++->* b // c包含匹配项+++->*//
  • => 3 <= 4 = 5 == 6包含匹配项<===(请记住,==>不匹配)
  • a <=> b <@> c包含匹配项<=><以及>
  • ---= =---包含匹配项---==---

2 个答案:

答案 0 :(得分:2)

编辑:在下面实施了abarnert的建议:

我会把它分成两部分:

第一部分将返回所有匹配的列表 - 包括'=&gt;'和'=',你不希望匹配。

p1 = re.compile(r'[<>=/*+-]+')

第二部分将过滤掉这些比赛。

all_matches = p1.finditer(your_string)
matches = [match.group() for match in all_matches if match.group() not in ('=', '=>')]

答案 1 :(得分:0)

这可能有效:

pat = re.compile(r'((?!=|=>)[<>=/*+-]+)')

它使用负面环视语法,详细说明如下: Regular expression to match a line that doesn't contain a word?

编辑:不幸的是,上面的简单外观与“&gt;”匹配当喂“=&gt;”所以要解决它可能会有点毛茸茸:

pat = re.compile(r'((?!=>|(?!=)>)([<>/*+-]|[<>=/*+-]{2,10}))')

我假设您不想匹配长于10的字符串。这将匹配分为单字符运算符(我们从中排除“=”)和多字符运算符(其中“=”即可)除了“=&gt;” - 它也排除了我们不感兴趣的边缘情况,只是“&gt;”被拒绝的“=&gt;”

然而,这是完全不可读的,如果它进入你的代码,应该有大量的评论。同意其他评论者,单个正则表达式不适合此问题。