regEx在notepad ++中工作,但在python中不工作

时间:2014-02-17 08:36:45

标签: python regex

让我们说有这个:

.................
=== Operation 'abcd::ddca:dsd' ended in 1.234s   /1.234s (100.00%) execution time
................

使用notepad ++,我能够通过以下方式识别:

^\=* Operation '([\d\D]*)' ended in (\d*.\d*)s\s*/(\d*.\d*)s \([\d\D]*\) execution time

我希望将操作名称和执行时间分组。

在python中,尝试这个:

exp=re.compile(r"^\=* Operation \'([\d\D]*)\' ended in (\d*.\d*)s\s*/(\d*.\d*)s \([\d\D]*\) execution time") 

什么也没提供。 我已经尝试\\(来逃避字面上的paranthesis但它没有用。我猜我不需要这样做,因为我在构建对象表达式时使用r“[exp]”。

关于如何获得与notepad ++相同结果的任何想法?

LE:仅尝试使用:

exp=re.compile(r"^\=* Operation \'([\d\D]*)\'", flags=re.MULTILINE)

仍然没有找到任何东西。

LE2:

稍后在我正在使用groups=exp.match(INPUT)的代码中 我得到了groups.group(n)

的配对

解答: 问题是match。使用search 修复了问题

4 个答案:

答案 0 :(得分:2)

问题中提到的正则表达式对我没有任何改变。

>>> s = """
... .................
... === Operation 'abcd::ddca:dsd' ended in 1.234s   /1.234s (100.00%) execution time
... ................
... """
>>> import re
>>> exp = re.compile(r"^\=* Operation \'([\d\D]*)\' ended in (\d*.\d*)s\s*/(\d*.\d*)s \([\d\D]*\) execution time", flags=re.M)
>>> re.search(exp, s)
<_sre.SRE_Match object at 0x1038766b8>
>>> re.findall(exp, s)
[('abcd::ddca:dsd', '1.234', '1.234')]

但要考虑两件事:

  1. 在flags参数
  2. 中使用re.M
  3. 用户searchfindall方法进行匹配。确保您没有使用re.match,因为它只匹配字符串的开头。

答案 1 :(得分:1)

我注意到你在abcd :: ddca:dsd

的末尾有双引号

所以:

exp=re.compile(r"^\=* Operation '([\d\D]*)\" ended in (\d*\.\d*)s\s*/(\d*\.\d*)s \([\d\D]*\) execution time", flags=re.MULTILINE)

答案 2 :(得分:0)

您需要允许^匹配行的开头,而不仅仅是整个字符串的开头

exp=re.compile(r"^\=* Operation '([\d\D]*)' ended in (\d*\.\d*)s\s*/(\d*\.\d*)s \([\d\D]*\) execution time", flags=re.MULTILINE)

答案 3 :(得分:0)

试试这个 - 我不是一个正则表达的大师,但这对我有用。

>>> i
"=== Operation 'abcd::ddca:dsd' ended in 1.234s   /1.234s (100.00%) execution time"
>>> exp = re.compile(r'^={3} Operation (.*?) ended in (\d+\.\d+s)(?:.*?)$')
>>> re.findall(exp,i)
[("'abcd::ddca:dsd'", '1.234s')]