使用regex获取菜单索引使用python失败,仅在

2024-04-20 01:07:52 发布

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

我想用python提取一个菜单索引。菜单索引是这样的树:

1.
1.1.
1.1.1.
2.
3.1.
3.2.

为此,我编写了以下代码:

first = re.findall(r"[0-9]{1}[.]{1}(?:([0-9][.])?(?:([0-9]?[.]?)))" , menu)

这不起作用,但是当我把regex放到在线regex工具(http://www.regexr.com/)中时,它就起作用了。你知道吗

这怎么可能?你知道吗


Tags: 工具代码recomhttpwww菜单regex
3条回答

实际上,你可以把regex减少很多

re.findall(r"[0-9]\.(?:[0-9]\.){,2}" , menu)

它做什么?

  • [0-9]匹配数字。我已经删除了{1},因为这很简单,因为这个模式只匹配一个字符。

  • \.匹配.,逃脱了特殊的含义。

  • (?:[0-9]\.){,2}匹配后跟.的数字,最小为零次,最大为2次。

测试

>>> string = """1.
... 1.1.
... 1.1.1.
... 2.
... 3.1.
... 3.2."""
>>> re.findall(r"[0-9]\.(?:[0-9]\.){,2}" , string)
['1.', '1.1.', '1.1.1.', '2.', '3.1.', '3.2.']
[0-9][.](?:(?:[0-9][.])?(?:(?:[0-9]?[.]?)))

你需要把所有的capturing groupsnon capturingre.findall列出所有groups如果有的话现在。你呢有2组,这样你可能只得到那些。看到了吗演示。你知道吗

https://regex101.com/r/hI0qP0/5

也可以使用(?:[0-9][.])+(?:[0-9][.]){1,3}。你知道吗

请参见演示。你知道吗

https://regex101.com/r/hI0qP0/6

更为谨慎的做法是允许章节有任意数量的数字(即可能有10多个章节或10多个项目/子项目)。那样的话,你可以用

(\d+)\.

这个正则表达式在句点之前查找数字并匹配这些数字;因此,对于一行:

>>> re.findall(r"(\d+)\." , "3.2.1.")
['3', '2', '1']

如果您将regex应用于整个字符串,您将按顺序获得所有数字;即,对于您的字符串,['1', '1', '1', '1', '1', '1', '2', '3', '1', '3', '2', '3']。我不太明白你想匹配哪些数据,或者你想用它做什么,所以,好吧,调整一下口味。:-)

要获取索引中包含数字的列表,可以使用:

>>> [re.findall(r"(\d+)", i) for i in string.split('\n')]
[['1'], ['1', '1'], ['1', '1', '1'], ['2'], ['3', '1'], ['3', '2'], ['3', '3']]

干杯, 保罗

相关问题 更多 >