我有一个包含两种类型行的文本文件。 一种类型如下:
'6-digit-primary-id','6-digit-secondary-id',subject,author,text
另一种只是没有特定模式的词语。 在前一种情况下,我想知道主要ID和文本,后者我想得到的话。 我尝试了什么:
PATTERN = r'[1-9]{6},[1-9]{6},?*,?*,*'
match = re.match(PATTERN,input_line)
if match:
primary_id = match.group()[0]
text = match.group()[7]
else:
text = input_line
但显然我做错了(得到'无效语法')
任何人都可以指出我正确的方向吗?
答案 0 :(得分:2)
?
在正则表达式模式中具有特殊含义。它(贪婪地)匹配前面的正则表达式中的0或1。所以,?
匹配逗号或不逗号。 ,?*
提出sre_compile.error
。
也许您打算.
而不是?
。它匹配除换行符之外的任何字符(除非指定了re.DOTALL标志)。
PATTERN = r'(\d{6}),(\d{6}),(.*?),(.*?),(.*)'
match = re.match(PATTERN, input_line)
if match:
primary_id = match.group(1)
text = match.group(5)
else:
text = input_line
其他一些建议:
\d
指定字符模式[0-9]
。请注意,这是在您的角色类中添加0
。 (我认为没关系)。如果没有,你可以坚持使用[1-9]{6}
。match.group(num)
代替match.group()[num]
的部分。 (看起来你想要match.group(5)
而不是match.group()[7]
。).*
匹配尽可能多的字符。 .*?
非贪婪地匹配。你需要非贪婪地匹配主题和作者模式,以免它们扩展以匹配整行的剩余部分。此处.*?
的替代方案为[^,]*
。这匹配0或更多
逗号以外的字符。
PATTERN = r'(\d{6}),(\d{6}),([^,]*),([^,]*),(.*)'
答案 1 :(得分:1)
在正则表达式中,*
表示不,前一个字符出现一次或多次,?
表示前一个字符没有或出现一次。所以?*
不是有效的表达式。您可能正在使用.*?
操作,这意味着“任何字符都没有,一个或多个时间但匹配的可能性越小”(非贪婪)。
你可能想要
PATTERN = r'[1-9]{6},[1-9]{6},.*?,.*?,.*'