python中的简单正则表达式

时间:2014-01-11 15:59:20

标签: python regex

我有一个包含两种类型行的文本文件。 一种类型如下:

'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

但显然我做错了(得到'无效语法')

任何人都可以指出我正确的方向吗?

2 个答案:

答案 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},.*?,.*?,.*'