Python条件正则表达式

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (24)

我的程序被赋予一个带参数的对象,我需要获取参数的值。

我的程序给出的对象如下所示:

Object = """{{objectName|
parameter1=random text|
parameter2=that may or may not|
parameter3=contain any letter (well, almost)|
parameter4=this is some [[problem|problematic text]], Houston, we have a problem!|
otherParameters=(order of parameters is random, but their name is fixed)}}"""

(所有参数可能存在也可能不存在)

我想获取属性值。

在前3行中,它非常简单。一个简单的正则表达式会找到它:

if "parameter1" in Object:
    parameter1 = re.split(r"parameter1=(.*?)[\|\}]", Object)[1]

if "parameter2" in Object:
    parameter2 = re.split(r"parameter2=(.*?)[\|\}]", Object)[1]

等等。

问题在于参数4,上面的regex(property4=(.*?)[\|\}])只会返回this is some [[problem,因为正则表达式在垂直条上停止。

现在就是这样:垂直条只会出现在“[[]]”中的文本的一部分。

例如,parameter1=a[[b|c]]d可能会出现,但parameter1=a|bc|永远不会出现。

我需要一个在垂直条上停止的正则表达式,除非它在双方括号内。例如,对于parameter4,我会得到this is some [[problem|problematic text]], Houston, we have a problem!

提问于
用户回答回答于

显然,没有完美的解决方案。

对于其他读者可能在将来阅读这个问题,最接近的解决方案是,如WiktorStribiżew在评论中指出的那样parameter4=([^[}|]*(?:\[\[.*?]][^[}|]*)*)

如果帕拉姆文本中不包含任何单一的正则表达式这只会工作[}并且|也可以含有[[...]]子串。

如果你想更好地理解这个正则表达式,你可能想看看这里:https//regex101.com/r/bWVvKg/2

用户回答回答于

当我删除“?”时在这里工作:

parameter4 = re.split(r"parameter4=(.*)[\|\}]", object_)[1]

我还将变量的名称更改为“object_”,因为“object”是Python中的内置对象

最好。

扫码关注云+社区

领取腾讯云代金券