【发布时间】:2020-02-03 07:12:03
【问题描述】:
我在正则表达式中搜索用逗号分隔的字符串,而不是在 python 中的括号之间:
示例:
string = '(parent son, daugther , father ), sister'
预期结果:
['(parent son, daugther , father )', 'sister']
感谢您的帮助
【问题讨论】:
标签: python regex python-3.x
我在正则表达式中搜索用逗号分隔的字符串,而不是在 python 中的括号之间:
示例:
string = '(parent son, daugther , father ), sister'
预期结果:
['(parent son, daugther , father )', 'sister']
感谢您的帮助
【问题讨论】:
标签: python regex python-3.x
一般来说,正则表达式不擅长匹配嵌套/递归结构。因此,虽然它可能有可能成功,但您可以更轻松地手动进行拆分,例如
groups = []
nesting = 0
idx = 0
for group in re.finditer(r'[,\(\)]', string):
assert nesting >= 0
if group[0] == '(':
nesting += 1
elif group[0] == ')':
nesting -= 1
elif nesting > 0:
continue # ignore commas in parens
else:
groups.append(string[idx:group.start()].strip())
idx = group.end()
# after last group
groups.append(string[idx:].strip())
【讨论】:
对于您的具体示例,我将使用正则表达式拆分,即使用正则后向拆分,即以逗号(以及后面的空格,如果有的话)拆分字符串,前面是右圆括号:
import re
string = '(parent son, daugther , father ), sister'
output = re.split(r'(?<=\)),\s+', string)
# ['(parent son, daugther , father )', 'sister']
【讨论】:
string = '(parent son, daugther , father ), sister, uncle' 呢?
用regex代替re,可以用(*SKIP)(*FAIL):
import regex
str = '(parent son, daugther , father ), sister'
res = regex.split(r'\(.+?\)(*SKIP)(*FAIL)|,', str)
print(res)
输出:
['(parent son, daugther , father )', ' sister']
\(.+?\) 正在尝试将左括号和右括号与里面的一些数据进行匹配(*SKIP)(*FAIL) 如果找到括号,则丢弃匹配项|否则, 匹配逗号。在这一点上,我们确定它不在括号之间。【讨论】: