除了<>=/*+-
和=
之外,我想匹配=>
的所有组合。我怎么能这样做?
r = re.compile(r'[<>=/*+-]+')
这匹配集合中的一个或多个字符,但我不知道如何阻止它匹配=
或=>
模式。我猜它与负向前瞻或者后视有关,但是我很难绕过它。
澄清:我确实希望匹配<>=/*+-
中除=
和=>
之外的所有字符组合。换句话说,我想找到仅包含这些字符的最大长度连续子串 - 如果子串等于=
或=>
,则不应将其视为匹配。
我为之前没有澄清而道歉,但这似乎是一个简单的问题陈述,不需要额外的澄清。
示例案例:
pow pow -> bah bah
包含匹配->
a +++->* b // c
包含匹配项+++->*
和//
=> 3 <= 4 = 5 == 6
包含匹配项<=
和==
(请记住,=
和=>
不匹配)a <=> b <@> c
包含匹配项<=>
和<
以及>
---= =---
包含匹配项---=
和=---
答案 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;”
然而,这是完全不可读的,如果它进入你的代码,应该有大量的评论。同意其他评论者,单个正则表达式不适合此问题。