【问题标题】:Regex with "r" read from file doesn't work correctly从文件中读取“r”的正则表达式无法正常工作
【发布时间】:2012-03-28 13:36:26
【问题描述】:

我可能对正则表达式有一些非常基本的问题。我有以下正则表达式,当硬编码在应用程序中时它工作正常,但后来我用 ConfigParser 读取它似乎不起作用:

r"\[[+-]?\d+(?:\.\d+)?\]"

我的阅读方式是:

Config = ConfigParser.ConfigParser()
Config.read("test.conf")
test_regex = Config.get("test","test_regex")
search_pattern = re.compile(test_regex)

test_result = search_pattern.findall(text_to_parse)

test.conf 部分

[test]
test_regex=r"\[[+-]?\d+(?:\.\d+)?\]"

测试的输入可能如下:

text_to_parse = " Here is the [TEST-DONE]" // Success: my regex is extracting [TEST-DONE]
text_to_parse = " Here is the some text" // Failure my regex returns empty list

这个问题有什么解决办法吗? 非常感谢,
塞尔希。

编辑:是我的注意力错误,正如我在回答的评论中提到的那样,但是从文件中的正则表达式中删除 r 的解决方案有很大帮助。

【问题讨论】:

  • 显示 test.conf 的相关位。
  • 不,没有人可以根据这些信息帮助您。展示一个完整、正确、简洁的代码示例和一个错误的会话,并解释它的错误之处。 sscce.org
  • print test_regex 看看你得到了什么。不要记住不要在配置文件中使用r 或引号;快速查看您在这些配置文件中未引用值的文档。
  • @Marcin 我认为除了 test.conf 文件之外提供的信息非常清楚。并且不要带着 sscce 来这里只是为了拖钓。
  • @Marcin:我必须同意。这个问题并没有你想象的那么糟糕,尤其是代码示例完整、正确和简洁,只是缺少配置文件输入。

标签: python regex file-io configparser


【解决方案1】:

可以使用ast.literal_eval按照Python规则解析字符串:

>>> import ast
>>> ast.literal_eval(conf.get("test", "test_regex"))
'\\[[+-]?\\d+(?:\\.\\d+)?\\]'

但是首先更改配置文件以包含未转义的正则表达式会更容易:

[test]
test_regex=\[[+-]?\d+(?:\.\d+)?\] 

>>> conf.get("test", "test_regex")
'\\[[+-]?\\d+(?:\\.\\d+)?\\]'

也就是说,正则表达式似乎并没有按照您的想法执行。它匹配:

  • 左括号
  • 后跟可选的 + 或 - 号
  • 后跟多个数字
  • 可选地后跟一个点和更多数字
  • 后跟右括号

例子:

>>> re.findall(r'\[[+-]?\d+(?:\.\d+)?\]', 'foo [+10] bar [-3.5]')
['[+10]', '[-3.5]']

当然,您的两个示例字符串中都不会有任何匹配项,因为它们不包含模式!

【讨论】:

  • 宾果游戏,我在配置文件中的错误我在没有注意到正则表达式和应用程序逻辑的情况下切换,这没有任何意义。非常感谢您解释从正则表达式中删除“r”以及对我的错误进行识别:S.
  • 顺便说一下,导入 ast 可能是一个解决方案,但在我的情况下不是......因为运行应用程序的机器不属于我们的组织,并且仍然安装了 python2.4:S。解决方案是修复配置文件,下次多注意,)
猜你喜欢
  • 1970-01-01
  • 2012-05-25
  • 2016-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多