【问题标题】:Regex to Match String Syntax in Code正则表达式匹配代码中的字符串语法
【发布时间】:2018-04-18 18:00:24
【问题描述】:

比如说,有一个 Python 源代码文件,比如:

def someStuff():
  return "blabla"

myThing = "Bob told me: \"Hello there!\""

twoStrings = "first part " + "second part"

我将如何编写一个正则表达式来匹配:

"blabla"、"Bob told me: \"Hello there!\""、"first part "、&"second part"

包括周围的引号?


最初,我认为这可以简单地使用\"[^\"]*\" 来完成,但这没有考虑到字符串包含\" 的情况。我也尝试过加入消极的后视镜:

(?<!\\)\"[^\"]*(?<!\\)\"

但没有任何成功。处理此问题的推荐方法是什么?

【问题讨论】:

  • 它有是正则表达式吗?有更好的方法从 python 代码中提取字符串文字。
  • @Aran-Fey 不幸的是,由于我所依赖的库,是的。虽然,从技术上讲,我可以重写整个事情,但除非我绝对确定这将是必需的,但我认为它不会因为正则表达式的强大功能,我真的不想这样做。
  • 如果使用正则表达式,您将不得不处理'''、r'、' """ ' 等内部可能出现的引号。您认为值得付出努力吗?或者这不是你的用例?

标签: python regex escaping syntax-highlighting


【解决方案1】:

这个正则表达式(带有单行修饰符s)应该匹配所有类型的字符串文字:

([bruf]*)("""|'''|"|')(?:(?!\2)(?:\\.|[^\\]))*\2

这支持三引号字符串、转义序列,它还可以捕获任何前缀,例如 r、u、f 和 b。请参阅online demo。

需要单行修饰符s 才能正确匹配多行字符串。此外,启用i 修饰符使其匹配R'nobody uses capitalized prefixes anyways' 等大写前缀。


据我所知,有两个警告:

  1. 它还匹配字节文字。
  2. 它匹配 cmets 中的字符串文字。

正则表达式的解释:

([bruf]*)          # match and capture any prefix characters
("""|'''|"|')      # match the opening quote
(?:                # as many times as possible...
    (?!\2)         # ...as long as there's no closing quote... 
    (?:            # ...match either...
        \\.        # ...a backslash and the character after it
    |              # ...or...
        [^\\]      # ...a single non-backslash character
    )        
)*
\2                 # match the closing quote

【讨论】:

  • 这个正则表达式是您自己设计的,还是您从其他来源获得的?如果有,能否分享出处?
  • @Snusifer 自己写的。
【解决方案2】:

使用消极的目光:

".*?(?<!\\)"

这使用惰性量词 (*?) 匹配直到下一个引号 ("),只要该引号没有被反斜杠 (\") 转义。与更简单(但错误)的正则表达式进行比较 ".*?"

【讨论】:

    猜你喜欢
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2023-03-18
    • 2012-06-05
    • 2013-12-25
    相关资源
    最近更新 更多