我可以将正则表达式负向lookbehind断言应用于整个表达式吗?

时间:2011-08-13 22:46:49

标签: python regex expression

我正在使用Python re尝试创建一个正则表达式,该表达式找到所有不以惊叹号(!)开头的驼峰词。

这就是我所拥有的:

(?<![!])([A-Z]?[a-z]+[A-Z][a-zA-Z]+)

负面的lookbehind断言仅应用于第一个[A-Z]块,而不是像我预期的那样应用于括号内的所有内容。无论如何应用负面的lookbehind断言,以便它像我预期的那样对整个组起作用?

另外,如果那是不可能的话。有没有人对我能做什么有任何建议?

我需要匹配(并最终替换)所有骆驼套话。我定义Camel Cased的方式如下:

  1. 单个大写字母或小写字母
  2. 开头的任何单词
  3. 一个或多个小写字母
  4. 大写字母
  5. 一个或多个小写字母
  6. 换句话说,任何单词都以仅一个大写字母开头,后跟一个或多个小写字母后跟一个大写字母后跟一个或多个小写字母。

    所有这些都很容易匹配,当我需要检查它是否以感叹号(!)开头时,问题就变得明显了。目标是找到所有不以该符号开头的单词。

    示例:

    • 正则表达式应匹配:HelloWorld
    • 正则表达式不应匹配:!HelloWorld

    在这样的句子中:“欢迎来到MyWorld!我们有!CoolStuff在这里!” 我应该能够提取MyWorld,但不能提取CoolStuff

    感谢您的帮助, -Sunjay03

    [编辑:]这是一个不起作用的字符串:

    "This is an example of !HelloWorld. Click that link FOO! Also, check out my iPods"
    

    正则表达式提取以下内容:

    ['elloWorld', 'iPods']
    

    解决方案: (?<![!])\b([A-Z]?[a-z]+[A-Z][a-zA-Z]+)

    感谢JBernardo的提示。此解决方案有效,因为它查找除感叹号之外的任何单词边界。

2 个答案:

答案 0 :(得分:3)

re.findall(r'(?<![!])\b\w+', ' !Hai  Yo!')

结果是['Yo']

顺便说一句,只需在验证时更改\w+即可保留\b

答案 1 :(得分:1)

看起来以下内容符合您的要求,

>>> reg=r'[^!]\b([a-zA-Z][a-z]+[A-Z][a-zA-Z]+)\b'
>>> text="Welcome to MyWorld! We have !CoolStuff here YouAgree?"
>>> re.findall(reg, text)
['MyWorld', 'YouAgree']
>>>