【问题标题】:Python regex (.*?) isn't giving an output [duplicate]Python regex (.*?) 没有给出输出[重复]
【发布时间】:2019-05-15 05:18:27
【问题描述】:

我正在制作一个项目,其中一部分是将 python 文件作为文本文件接收并使用正则表达式对其进行解析。

我能够很好地使用这个(其中程序是一个包含换行符的代码的字符串):

findall(r"def (.*?)\((.*?)\)", program)

但是当我期望它给出一个匹配对象时,这一行只给出了 None ,其中 .group() 返回“func1(None, None)”

mainblock = search(r'if __name__ == "__main__":(.*?)#END', program)

我正在解析的python文件的缩写版本如下:

def func1(stuff, morestuff):
    pass

if __name__ == "__main__":
    func1(None, None)
#END

我检查了正则表达式本身是否存在任何差异,但找不到任何差异。我还尝试直接从代码文件中复制/粘贴它,但仍然找不到匹配项

【问题讨论】:

  • 是的,程序只是一个包含程序的长字符串,我也尝试添加多行 - 它仍然找不到它
  • 这似乎对我有用:ideone.com/rS2slo
  • .*? 不会跨越换行符,除非您使用 re.MULTILINE 修饰符。
  • @Barmar 刚试过,还是返回 None
  • 是的,搞糊涂了。下面的答案得到了正确的标志。

标签: regex python-3.x


【解决方案1】:

您需要在正则表达式中包含换行符\n,像这样,

r'if __name__ == "__main__":\n(.*?)\n#END'

或启用DOTALL 标志,这意味着. 也匹配换行符。

MULTILINE 表示其他意思,可能违反直觉。)

【讨论】:

  • 这是 DOTALL 的工作演示。 ideone.com/rS2slo
  • DOTALL 完美运行
  • MULTILINE 应该被命名为 ANCHOR_TO_LINE....
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多