如何选择将其他子字符串与Python正则表达式匹配?

时间:2013-07-30 00:46:19

标签: python regex

我的计算机上的文本文件中有一堆代码。我对文件中的两种不同类型的代码感兴趣。他们是:

<string>objectiwant1 <string2>objectiwant2</string2></string>

<string>objectiwant1 </string>

第一个将返回[(objectiwant1,objectiwant2)](如果存在更多元组),而第二个将返回[(objectiwant1,None)]。

我正在尝试创建一个正则表达式,到目前为止,我所看到的有缺陷的代码看起来像这样:

regularexpression = r'<string>(.*) <string2>(.*)</string2>'

我正在使用“re.findall(regularexpression,file)”来返回数据。只有在使用string和string2时才会返回我想要的内容。使用:

regularexpression = r'<string>(.*) (<string2>(.*)</string2>)|(</string>)

返回较大括号内的所有内容,有时两次(而不是(。*)中的数据,这是分隔我想要与OR运算符进行比较的语句所必需的。

我想知道是否有一些东西可以用来分隔括号,它不会导致re.findall两次输出数据并一次输出如此多的数据。

我也想知道是否有一种方法可以使用正则表达式来输出数据,如果一个语句没有满足(所以如果objectiwant2不存在,我可以选择输出是什么)。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

您需要non-capturing group零次或一次:

>>> regular_expression = r'<string>(.*) (?:<string2>(.*)</string2>)?</string>'
>>> re.findall(regular_expression,
               "<string>objectiwant1 <string2>objectiwant2</string2></string>")
[('objectiwant1', 'objectiwant2')]
>>> re.findall(regular_expression, 
               "<string>objectiwant1 </string>")
[('objectiwant1', '')]