已验证的多行正则表达式在notepad ++中有效,但在python中没有结果

时间:2016-12-14 23:31:23

标签: python regex notepad++

我是一个python noob,我在使用正则表达式结果时遇到了一些麻烦。我写了我的正则表达式并验证它在记事本++中有效。当我将正则表达式从notepad ++转移到python时,我必须考虑什么?我觉得正则表达式中的\ r \ n是麻烦,但我得到的结果是打印结果的“无”结果。怎么了?谢谢您的帮助!

#!python

import re
scmFile = open("scm.txt")
scmContent = scmFile.read()
nameRegex = re.compile(r"(899\*0)\r\n[ ]+(([a-z, A-Z-])+[ ]([a-z,A-Z-])+)", re.MULTILINE)
searchResults = nameRegex.search(scmContent)
#print(scmContent)
print(searchResults)

2 个答案:

答案 0 :(得分:1)

我建议将\r转换为可选子模式,并按如下方式优化第2组子模式:

nameRegex = re.compile(r"(899\*0)\r?\n[ ]+([a-z, A-Z-]+(?:[ ][a-z,A-Z-]+)?)")

请参阅regex demo注意 [...]中的逗号是有意义的,如果您将它们用作范围分隔符,请考虑删除逗号。我只留下[ ]内的空格,因为如果你打算使用re.VERBOSE标志会使模式中的所有空格(外部字符类)毫无意义(仅用于格式化目的),它可能会很方便。 / p>

请注意re.MULTILINE标志是多余的,因为它只重新定义^$锚的行为,并且对输入字符串解析没有任何影响。

模式说明

  • (899\*0) - 第1组捕获899*0
  • \r?\n - 可选的CR跟随LF
  • [ ]+ - 1 +常规空间
  • ([a-z, A-Z-]+(?:[ ][a-z,A-Z-]+)?) - 第2组捕获以下序列:
    • [a-z, A-Z-]+ - 一个或多个ASCII字母,,,空格,-
    • (?:[ ][a-z,A-Z-]+)? - 出现一次或多次:
      • [ ] - 空格
      • [a-z,A-Z-]+ - 一个或多个ASCII字母,,-

答案 1 :(得分:0)

  

我认为这可能与\ r \ n有关,但是为什么\ r包含在记事本++中,而不包含在python文件中?

请参见Reading and Writing Files

  

通常,文件以文本模式打开,...

     

在文本模式下,读取时的默认设置是将特定于平台的行尾(在Un​​ix上为\ n,在Windows上为\ r \ n)转换为\ n。