首页 > 解决方案 > Python Regex 中可能存在的错误......或者我错过了一些东西 - 无法匹配

问题描述

所以我有一个字符串s:

'MakeMoney EURUSD,M1 2021.08.06-2021.08.10'

和一段代码:

import re
pat1 = re.compile(r'''
(?P<robot>[^\s]+) 
\s 
(?P<asset>[^","]+)
"," 
(?P<tf>[^\s]+)
\s 
(?P<datefrom>[0-9]{4}[.][0-9]{2}[.][0-9]{2})
"-" 
(?P<dateto>[0-9]{4}[.][0-9]{2}[.][0-9]{2})
''', re.VERBOSE)

m = pat1.search(s)
m.groupdict()

出现以下错误(忽略行号 - 其他不影响此的代码):

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/tmp/ipykernel_32277/1686568363.py in <module>
     50 
     51 m = pat1.search(s)
---> 52 m.groupdict()
     53 

AttributeError: 'NoneType' object has no attribute 'groupdict'

我追求的是:

{'robot': 'MakeMoney', 'asset': 'EURUSD', 'tf': 'M1', 'datefrom': '2021.08.06', 'dateto': '2021.08.10'}

我不知道为什么它不匹配......我搜索了 regex101 并尝试了 pythex - 有问题的 - 没有解决方案。我错过了什么?将 \A 和 \Z 添加到模式的开头和结尾没有帮助。

真正令人讨厌的是我在其他地方使用相同的方法没有问题,但模式和字符串结构不同......

标签: pythonregex

解决方案


您原来的正则表达式只有 2 个错误,即:

  1. ","
  2. "-"

在原始字符串中,没有引号:

MakeMoney EURUSD,M1 2021.08.06-2021.08.10
                ^             ^

除非你匹配

MakeMoney EURUSD","M1 2021.08.06"-"2021.08.10
                ^^^             ^^^

那么就适用了。

所以你应该删除引号。

...
pat1 = re.compile(r'''
(?P<robot>[^\s]+) 
\s 
(?P<asset>[^","]+)
, 
(?P<tf>[^\s]+)
\s 
(?P<datefrom>[0-9]{4}[.][0-9]{2}[.][0-9]{2})
- 
(?P<dateto>[0-9]{4}[.][0-9]{2}[.][0-9]{2})
''', re.VERBOSE)
...

它应该在之后工作。

旁注:如果您担心转义正则表达式中使用的特殊字符,请注意使用反斜杠\,例如,如果您想匹配句点字符 then\.而不是引号"."或括号[.]


推荐阅读