0

我可能对正则表达式有非常基本的问题。我有以下正则表达式,当在应用程序中硬编码时它工作正常,但后来我用 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

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

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

4

1 回答 1

4

您可以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]']

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

于 2012-03-28T13:50:43.160 回答