我试图检查输入文件的语法,我的项目的规则在哪里。
我想检查一下是否正确。所以我有我的正则表达式
\s*.*\$\s*..*\$\s*\|}\s*.*\s*,*
找到了这个文字:
sometimes $so$ |} hello,
life $good$ |} hello,
not $that$ |} hello
现在在python中我使用re.findall查找正确的文本,加入找到的模式,然后将其与起始文本的长度进行比较。但由于某种原因,它不起作用。
代码:rule_syntax_check = re.findall("\s*.*\$\s*..*\$\s*\|}\s*.*\s*,*", RULES, re.DOTALL)
例如会导致错误:
sometimes $so$ |} hello,
life $good$ | } hello,
not $that$ |} hello
但它也找到第二行,因此字符数与我findall
找到的字符数相同。还有其他选择,或者我缺少什么?
答案 0 :(得分:1)
问题在于您正在使用re.DOTALL
a.k.a S
标志。 DOTALL
表示该点与新行相匹配;如果你take it out,则匹配不能跨越新行。
然而,更好的解决方案是分别测试每条记录;例如,如果它们以逗号分隔,则您首先按,
拆分,然后使用re.match
将单个规则与正则表达式匹配。请注意,re.match
未锚定到字符串的末尾,因此您需要添加额外的$
以确保需要与完全字符串匹配(尽管此处不需要):
类似的东西:
rules_split = RULES.split(',')
for i in rules_split:
if not re.match(r'\s*.*\$\s*.+\$\s*\|}.*$')