【问题标题】:Spaces in Python Regular ExpressionsPython 正则表达式中的空格
【发布时间】:2014-08-13 16:39:25
【问题描述】:

我目前正在编写一个 Python 脚本,它将搜索整个 .c.h 文件并找到所有函数定义,以便我可以进行一些细微的编辑。要查找所有函数定义,我正在尝试使用正则表达式。

我目前拥有的是:

"r'\w+?\s+?\w+?\s*?\(.*?\)[\n\s]*?{"

这个逻辑的问题是它目前在某些情况下会接受某些if 语句。例如:

else
   if(//herpderp){}

这样做是因为\s 包含\n。我觉得如果我让我的表达式只寻找空格而不是任何空格,我就不会遇到这个问题,但我无法测试我的理论,因为似乎没有\(insert letter here) 只是一个简单的空间。

那么问题就来了。如果您对如何修复我的正则表达式有任何建议,或者如果有更好的方法来编写脚本,请告诉我。

【问题讨论】:

    标签: python regex spaces


    【解决方案1】:

    可以通过使用单个空格来匹配单个空格,就像匹配任何其他不是元字符的字符一样:

    "r'\w+? +?\w+? *?\(.*?\)\s*?{"
    

    ' +?' 序列仅匹配一个或多个空格,非贪婪。我将[\n\s] 替换为\s,因为\n 已经包含在内。

    您可以扩展为具有更多类型空格的字符类:

    [ \t]
    

    匹配空格或制表符。

    【讨论】:

      【解决方案2】:

      这样做是因为 \s 包含 \n

      我不确定这是一个好的理论,因为允许用 C 编写类似的东西:

      int
      
      
          main()
      

      一种可能的方法是使用黑名单或白名单来确保您获得的是功能。示例:

      r'\b(int|float|double|char)\s+(\w+)\s*\([^)]*\)\s*{'   // whitelist
      

      r'(?!(?:else)\b)\b(\w+)\s+(\w+)\s*\([^)]*\)\s*{'    // blacklist
      

      注意:不需要使用惰性量词。

      【讨论】:

      • 公平地说,我不认为 C 是一种常规语言,因此正则表达式不太适合解析它。在他的编辑器中重构它可能比编写 Python 程序更容易:)
      • @AdamSmith:我不是 C 专家,但我不确定参数中是否允许嵌套括号。无论如何,对于现代正则表达式引擎(尤其是新的正则表达式模块)来说,语言是否是正则这一事实不再是问题。
      • 我没用过正则表达式模块——值得学习和学习吗?
      • @AdamSmith: 是的,它很容易安装(没问题),相对容易学习和使用(向后兼容 re 模块),并且有非常有趣的功能,你在其他地方找不到脚本语言(如模糊搜索)
      猜你喜欢
      • 2011-08-10
      • 2012-02-02
      • 2020-09-22
      • 1970-01-01
      • 2016-08-18
      • 2013-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多