我是一个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)
答案 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文件中?
通常,文件以文本模式打开,...
在文本模式下,读取时的默认设置是将特定于平台的行尾(在Unix上为\ n,在Windows上为\ r \ n)转换为\ n。