使用 python 中的条件逐行拆分字符串

split string row wise with condition in python

我在一列中有一些字符串,我只想将括号内 不是 的单词展开。该列看起来像这样

pd.DataFrame(data={'a': ['first,string','(second,string)','third,string (another,string,here)']})

我希望输出看起来像这样

pd.DataFrame(data={'a': ['first','string','(second,string)','third','string','(another,string,here)']})

这种方法可行,但我不想每次都输入行号

re.split(r',(?![^()]*\))', x['a'][0])
re.split(r',(?![^()]*\))', x['a'][1])
re.split(r',(?![^()]*\))', x['a'][2])

我以为我可以使用 lmbda 函数,但我无法让它工作。感谢您查看此内容

x['a'].apply(lambda i: re.split(r',(?![^()]*\))', i))

我不清楚您的 DataFrame 中的元素是否在括号之间有多个组。鉴于这种疑问,我实施了以下措施:

import pandas as pd
import re

df = pd.DataFrame(data={'a': ['first,string','(second,string)','third,string (another,string,here)']})

pattern = re.compile("([^\(]*)([\(]?.*[\)]?)(.*)", re.IGNORECASE)

def findall(ar, res = None):
    if res is None:
        res = []
    m = pattern.findall(ar)[0]
    if len(m[0]) > 0:
        res.extend(m[0].split(","))
    if len(m[1]) > 0:
        res.append(m[1])
    if len(m[2]) > 0:
        return findall(ar[2], res = res)
    else:
        return res
    
res = []
for x in df["a"]:
    res.extend(findall(x))
    
print(pd.DataFrame(data={"a":res}))

本质上,您递归地扫描匹配项的最后部分,直到在字符串之间找不到更多单词。如果顺序不是问题,解决方案会更简单。