[英]Fixed Length Regex Required?
我有这个正则表达式,它使用前向和后向预测:
import re
re.compile("<!inc\((?=.*?\)!>)|(?<=<!inc\(.*?)\)!>")
我正在尝试将它从 C# 移植到 Python,但不断出现错误
look-behind requires fixed-width pattern
是否有可能在不失去意义的情况下用 Python 重写它?
这个想法是让它匹配类似的东西
<!inc(C:\My Documents\file.jpg)!>
更新
我正在使用 lookarounds 来解析我修改过的 HTTP 多部分文本
body = r"""------abc
Content-Disposition: form-data; name="upfile"; filename="file.txt"
Content-Type: text/plain
<!inc(C:\Temp\file.txt)!>
------abc
Content-Disposition: form-data; name="upfile2"; filename="pic.png"
Content-Type: image/png
<!inc(C:\Temp\pic.png)!>
------abc
Content-Disposition: form-data; name="note"
this is a note
------abc--
"""
multiparts = re.compile(...).split(body)
我只想在拆分时获取文件路径和其他文本,而不必删除开始和结束标记
代码简洁很重要,但我愿意更改<!inc(
格式,如果它使正则表达式可行的话。
从文档中:
(?<....)
如果字符串中的当前位置前面没有匹配...,则匹配。这称为负向后断言。 与积极的回顾断言类似,包含的模式必须只匹配一些固定长度的字符串。 以否定后向断言开头的模式可能会匹配正在搜索的字符串的开头。
(?<=...)
如果字符串中的当前位置前面有以当前位置结束的...的匹配项,则匹配。 这称为积极的回顾断言。 (?<=abc)def 将在 abcdef 中找到匹配项,因为后视将备份 3 个字符并检查包含的模式是否匹配。 包含的模式必须只匹配某个固定长度的字符串,这意味着允许使用 abc 或 a|b,但不允许使用 a* 和 a{3,4}。 请注意,以正后向断言开头的模式将不会匹配正在搜索的字符串的开头; 您很可能希望使用 search() 函数而不是 match() 函数:
强调我的。 不,我不认为您可以将它以当前形式移植到 Python。
对于同一数组中的路径+“一切”,只需在开始和结束标记上拆分:
import re
p = re.compile(r'''<!inc\(|\)!>''')
awesome = p.split(body)
你说你在结束标签上很灵活,如果)!>
可以出现在代码的其他地方,你可能需要考虑将该结束标签更改为)!/inc>
之类的东西(或任何东西,只要它是唯一的)。
import re
pat = re.compile("\<\!inc\((.*?)\)\!\>")
f = pat.match(r"<!inc(C:\My Documents\file.jpg)!>").group(1)
结果f == 'C:\My Documents\file.jpg'
回应乔恩·克莱门茨:
print re.escape("<!inc(filename)!>")
结果是
\<\!inc\(filename\)\!\>
结论: re.escape
似乎认为他们应该被逃脱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.