【问题标题】:Python regex works online but not in codePython 正则表达式可以在线工作,但不能在代码中使用
【发布时间】:2019-10-10 07:32:17
【问题描述】:

这个正则表达式模式:^.+\'(.+.png) 在在线编辑器中有效,但在 python 代码中无效。我看到其他帖子也有同样的问题。我尝试应用这些;

  • 添加额外的转义斜线

  • 在开头加上r

正则表达式应该从单引号开始匹配,直到它到达 .png。

例如:

用这个字符串Executing identify -format %k 'testcases/art/test_files/video_images/single-[snk1=640x480p59.9]-[src1=720x480i59.9].png'

我要:testcases/art/test_files/video_images/single-[snk1=640x480p59.9]-[src1=720x480i59.9].png

我试过了(不按时间顺序):

result = re.findall("^.+\\'(.+\\.png)", self.stream.getvalue()) # I also tried prepending all of these with r
result = re.findall("^.+\'(.+.png)", self.stream.getvalue())
result = re.findall("^.+'(.+.png)", self.stream.getvalue())
result = re.findall("^.+'(.+.png)", str(self.stream.getvalue()))
result = re.findall("\^.+'(.+.png)\", self.stream.getvalue())

编辑:我也尝试使用re.match()re.search()

更新:

我从哪里得到字符串可能是负责cStringIO.StringO.getvalue(),这是代码self.stream.getvalue() 中的这一部分。这是我没有写的代码。我该如何使用正则表达式?

【问题讨论】:

  • 你的第二行和第三行 re.findall 工作。见this demo。请注意,您需要在 png 之前转义 .,因为它是一个文字点。
  • @WiktorStribiżew 看来我从哪里得到字符串是负责任的。我从cStringIO.StringO.getvalue() 得到字符串
  • 那么cStringIO.StringO.getvalue()的内容是什么?你发布的不是你当时拥有的。
  • 通常情况下,re.findall("'([^']+\.png)'", str(self.stream.getvalue())) 之类的东西可能会起作用
  • @gelonida 嗯,你读过整篇文章吗?因为我说过我也尝试过这样做:-)

标签: python regex python-2.x


【解决方案1】:

您需要将self.stream.getvalue() 的输出转换为字符串,并丢弃模式中的^.+ 部分,因为re.findall 在输入字符串内的任何位置搜索所有匹配项。

使用

results = re.findall(r"'([^']+\.png)", str(self.stream.getvalue()))

另外,请注意转义模式中的文字 . 字符点。

模式详情

  • ' - 单引号
  • ([^']+\.png) - 捕获组 1:
    • [^']+ - 除了' 之外的 1+ 个字符
    • \.png - .png 子字符串。

【讨论】:

  • 我实际上确实需要所有出现的 .png 文件。 re.findall( "'([^']+\.png)'", str(self.stream.getvalue())) 在单引号之间是否仍然有效?
  • @BasVelden 我编辑了答案并添加了模式解释。我假设单引号内只有一个匹配项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多