gpt4 book ai didi

Python/Regex - 括号和斜杠的扩展

转载 作者:太空狗 更新时间:2023-10-30 01:02:15 29 4
gpt4 key购买 nike

我正在寻找一种方法来扩展由斜杠分隔的数字。除了斜线外,括号还可以用在一些(或所有)数字周围来表示一个“组”,它可以重复(按紧跟在括号后面的次数)或反向重复(后跟“s”作为在第二组示例中显示)。一些例子是:

1          -> ['1']                          -> No slashes, no parentheses
1/2/3/4 -> ['1', '2', '3', '4'] -> basic example with slashes
1/(2)4/3 -> ['1', '2', '2', '2', '2', '3'] -> 2 gets repeated 4 times
1/(2/3)2/4 -> ['1', '2', '3', '2', '3', '4'] -> 2/3 is repeated 2 times
(1/2/3)2 -> ['1', '2', '3', '1', '2', '3'] -> Entire sequence is repeated twice
(1/2/3)s -> ['1', '2', '3', '3', '2', '1'] -> Entire sequence is repeated in reverse
1/(2/3)s/4 -> ['1', '2', '3', '3', '2', '4'] -> 2/3 is repeated in reverse

在最一般的情况下,甚至可以嵌套括号,我知道这通常会使正则表达式的使用变得不可能。在我需要处理的当前数据集中,没有像这样的嵌套集,但我可以看到它在未来的潜在用途。例如:

1/(2/(3)2/4)s/5 -> 1/(2/3/3/4)s/5
-> 1/2/3/3/4/4/3/3/2/5
-> ['1', '2', '3', '3', '4', '4', '3', '3', '2', '5']

我当然知道正则表达式不能完成所有这些(尤其是重复/反转括号组)。但是,如果我可以获得一个至少将括号字符串与不在括号中的字符串分开的正则表达式,那么我可能可以很容易地进行一些循环来处理其余部分。所以,我正在寻找的正则表达式会做类似的事情:

1               -> ['1']
1/2/3/4 -> ['1', '2', '3', '4']
1/(2)4/3 -> ['1', '(2)4', '3']
1/(2/3)2/4 -> ['1', '(2/3)2', '4']
1/(2/(3)2/4)s/5 -> ['1', '(2/(3)/2/4)s', '5']

然后我可以循环这个结果并继续扩展任何括号直到我只有数字。

编辑

我在原来的帖子中并不完全清楚。在我试图使示例尽可能简单的过程中,我可能过度简化了它们。这需要对大于等于 10 的数字以及负数起作用。

例如:

1/(15/-23)s/4   -> ['1', '(15/-23)s', '4']
-> ['1', '15', '-23', '-23', '15', '4']

最佳答案

由于您要处理嵌套括号,正则表达式在这里帮不了您多少。它不能像您最后想要的那样轻松地将字符串转换为列表。

您最好自己解析字符串。你可以试试这段代码,只是为了最后满足你的要求:

在不丢失括号的情况下将字符串解析为列表:

def parse(s):

li = []

open = 0
closed = False
start_index = -1

for index, c in enumerate(s):
if c == '(':
if open == 0:
start_index = index
open += 1

elif c == ')':
open -= 1
if open == 0:
closed = True

elif closed:
li.append(s[start_index: index + 1])
closed = False

elif open == 0 and c.isdigit():
li.append(c)

return li

这将为字符串 '1/(2/(3)2/4)s/5' 提供以下列表:

['1', '(2/(3)2/4)s', '5']

对于字符串 '1/(15/-23)s/4',根据您更改的要求,这给出:

['1', '(15/-23)s', '4']

现在,您需要注意进一步打破括号以获得不同的列表元素。


将带括号的字符串扩展为单个列表元素:

在这里,您可以通过一次处理最里面的括号来使用正则表达式:

import re

def expand(s):

''' Group 1 contains the string inside the parenthesis
Group 2 contains the digit or character `s` after the closing parenthesis

'''
match = re.search(r'\(([^()]*)\)(\d|s)', s)
if match:
group0 = match.group()
group1 = match.group(1)
group2 = match.group(2)
if group2.isdigit():
# A digit after the closing parenthesis. Repeat the string inside
s = s.replace(group0, ((group1 + '/') * int(group2))[:-1])
else:
s = s.replace(group0, '/'.join(group1.split('/') + group1.split('/')[::-1]))

if '(' in s:
return expand(s)

return s

li = parse('1/(15/-23)2/4')

for index, s in enumerate(li):
if '(' in s:
s = expand(s)
li[index] = s.split('/')

import itertools
print list(itertools.chain(*li))

这将为您提供所需的结果:

['1', '15', '-23', '-23', '15', '4']

上面的代码遍历parse(s) 方法生成的列表,然后对每个元素递归展开最里面的括号。

关于Python/Regex - 括号和斜杠的扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18243119/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com