Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何选择将附加子字符串与Python正则表达式匹配?_Python_Regex - Fatal编程技术网

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

如何选择将附加子字符串与Python正则表达式匹配?,python,regex,Python,Regex,我的计算机上的文本文件中有一堆代码。我对文件中的两种不同类型的代码感兴趣。它们是: <string>objectiwant1 <string2>objectiwant2</string2></string> objectwant1 objectwant2 及 objectivewant1 第一个将返回[(ObjectWant1,ObjectWant2)](如果存在更多元组),而第二个将返回[(ObjectWant1,None)] 我正在尝试创

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

<string>objectiwant1 <string2>objectiwant2</string2></string>
objectwant1 objectwant2

objectivewant1
第一个将返回[(ObjectWant1,ObjectWant2)](如果存在更多元组),而第二个将返回[(ObjectWant1,None)]

我正在尝试创建一个正则表达式,到目前为止,我得到的有缺陷的代码如下所示:

regularexpression = r'<string>(.*) <string2>(.*)</string2>'
regularexpression=r'(.*)(.*)”
我使用“re.findall(regularexpression,file)”返回数据。它仅在同时使用string和string2时返回我想要的内容。使用:

regularexpression = r'<string>(.*) (<string2>(.*)</string2>)|(</string>)
regularexpression=r'(.*)(.*)|()
返回大括号中的所有内容,有时返回两次(而不是只返回(.*)中的数据),这是分隔要与OR运算符比较的语句所必需的

我想知道是否有什么东西可以用来分隔括号,这样就不会导致re.findall两次输出数据,一次输出这么多数据

我还想知道,如果语句没有实现,是否有一种方法可以使用正则表达式输出数据(因此,如果ObjectWant2不存在,我可以选择输出是什么)

提前谢谢。

您想要零次或一次:

>>> 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', '')]
>>正则表达式=r'(.*)(?:(.*))?'
>>>关于findall(正则表达式,
“目标1目标2”)
[('ObjectWant1','ObjectWant2')]
>>>关于findall(正则表达式,
“目标1”)
[('ObjectWant1','')]
您想要零次或一次:

>>> 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', '')]
>>正则表达式=r'(.*)(?:(.*))?'
>>>关于findall(正则表达式,
“目标1目标2”)
[('ObjectWant1','ObjectWant2')]
>>>关于findall(正则表达式,
“目标1”)
[('ObjectWant1','')]

您可能还希望
(.*)
是非贪婪的,否则当同一行上有多个标记时,这将不起作用。@PauloAlmeida取决于输入,但这可能是一个正常的默认值。谢谢,这非常有效。但是,是否可以将“”更改为无输出而不是空字符串,就像在search()中一样?@eltb不确定为什么需要
None
,但如果要过滤空字符串,您可以始终执行
[在re.findall(正则表达式,“ObjectWant1”)]中匹配或无匹配]
。您可能还需要
(.*)
必须是非贪婪的,否则当同一行上有多个标记时,这将不起作用。@PauloAlmeida取决于输入,但这可能是一个正常的默认值。谢谢,这非常有效。是否可以将“”更改为无输出,而不是空字符串,就像在search()中一样?@eltb不确定为什么需要
None
,但如果要过滤掉空字符串,您可以始终执行
[在re.findall(正则表达式,“objectwant1”)]中匹配或无匹配]
。可能重复的