繁体   English   中英

需要固定长度的正则表达式吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM