1

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

<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 不存在,我可以选择输出是什么)。

先感谢您。

4

1 回答 1

1

您想要一个非捕获组零次或一次:

>>> 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', '')]
于 2013-07-30T01:11:27.250 回答