我的计算机上的文本文件中有一堆代码。我对文件中的两种不同类型的代码感兴趣。他们是:
<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不存在,我可以选择输出是什么)。
提前谢谢。
答案 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', '')]