从文件中读取“r”的正则表达式无法正常工作

时间:2012-03-28 13:36:26

标签: python regex file-io configparser

我可能有关于正则表达式的非常基本的问题。我有以下正则表达式,当硬编码int应用程序工作正常,但后来我用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从文件中移位时,解决方案有很多帮助。

1 个答案:

答案 0 :(得分: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]']

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