Python:帮助编写regex模式

2024-04-20 01:30:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我只是在学习python,但有一个问题,即如何为下面的字符串创建regex模式

"...', 'begin:32,12:1:2005-10-30 T 10:45:end', 'begin:33,13:2:2006-11-31 T 11:46:end', '... <div dir="ltr">begin:32,12:1:2005-10-30 T 10:45:end<br>begin:33,13:2:2006-11-31 T 11:46:end<br>..."

我试图在n次迭代中提取begin:和:end之间的数据,而不获取重复数据。我附上了我目前的尝试。在

^{pr2}$

输出为:

^{3}$

我希望它是:

32
12
1
2005-10-30 T 10:45
33
13
2
2006-11-31 T 11:46

谢谢你的帮助。在


Tags: 数据字符串brdivdir模式regexend
3条回答

你需要使你的模式的可变大小部分“非贪婪”。也就是说,使它们匹配尽可能小的字符串,而不是最长的字符串(这是默认值)。在

尝试模式'.begin:(.*?),(.*?):(.*?):(.*?:.*?):end.'。在

另一个选择是布莱克恩特和蒂姆·皮茨克的

re.findall("begin:([^,]*),([^:]*):([^:]*):([^:]*:[^:]*):end", s)

不是选择非贪婪扩展,而是使用[^X]来表示某些X的“任何字符但是X”

优点是它更严格:没有办法在结果中获取分隔符,因此

^{pr2}$

不匹配,而对于Blckknght和Tim Pietzcker的,则可能不匹配。这在现实世界中可能并不重要。在

当然,缺点是它更僵硬。在

我建议两种方法都更合理。在

.*是一个贪婪的,与你想要的:end边界相匹配。将所有.*替换为lazy.*?。在

>>> s = """...', 'begin:32,12:1:2005-10-30 T 10:45:end', 'begin:33,13:2:2006-11-31 T 11:46:end', '... <div dir="ltr">begin:32,12:1:2005-10-30 T 10:45:end<br>begin:33,13:2:2006-11-31 T 11:46:end<br>..."""
>>> re.findall("begin:(.*?),(.*?):(.*?):(.*?:.*?):end", s)
[('32', '12', '1', '2005-10-30 T 10:45'), ('33', '13', '2', '2006-11-31 T 11:46'), 
 ('32', '12', '1', '2005-10-30 T 10:45'), ('33', '13', '2', '2006-11-31 T 11:46')]

使用修改后的模式,强制在匹配的开始/结尾出现单引号:

^{pr2}$

相关问题 更多 >