Python 在逗号和#x27上拆分字符串;和';s、 &x27;或';s

Python 在逗号和#x27上拆分字符串;和';s、 &x27;或';s,python,regex,string,tokenize,Python,Regex,String,Tokenize,我想从自然编写的字符串列表转到python列表 样本输入: s1 = 'make the cake, walk the dog, and pick-up poo.' s2 = 'flour, egg-whites and sand.' 输出: split1 = ['make the cake', 'walk the dog', 'pick-up poo'] split2 = ['flour', 'egg-whites', 'sand'] 我想在删除拆分和空字符串的同时拆分逗号(和句点)、“a

我想从自然编写的字符串列表转到python列表

样本输入:

s1 = 'make the cake, walk the dog, and pick-up poo.'
s2 = 'flour, egg-whites and sand.'
输出:

split1 = ['make the cake', 'walk the dog', 'pick-up poo']
split2 = ['flour', 'egg-whites', 'sand']
我想在删除拆分和空字符串的同时拆分逗号(和句点)、“and”和“or”上的字符串。由于牛津逗号的使用缺乏标准化,我不能只使用逗号

我尝试了以下方法:

重新导入
如果x不在['','','',''中,则在re.split('([A-Za-z-]+)',s1)中的x的[x.strip()
其中:

['make the cake', 'walk the dog', 'and pick-up poo']
很接近。但是对于
s2
它给出:

['flour', 'egg-whites and sand']
我可以跨元素进行一些后处理,以通过
(and | or)
连续拆分元素,但我确实希望通过逗号集and和or来标记

我尝试了一些奇特的正则表达式拆分,以便对
之类的内容进行负面展望,但它不想在这个词上拆分

[x.strip() for x in re.split('([A-Za-z -]+(?!and))', s2) if x not in ['', ',', '.']]
[x.strip() for x in re.split('([A-Za-z -]+(?!\band\b))', s2) if x not in ['', ',', '.']]
这也给了

['flour', 'egg-whites and sand']
我意识到有很多边缘案例,但我觉得我很接近,只是错过了一些小东西。

你可以使用

\s*(?:\b(?:和|或)\b |[,.])\s*
看。详情:

  • \s*
    -0+空格
  • (?:\b(?:and | or)\b |[,.])
    -一个完整的单词
    ,或逗号/句点
  • \s*
    -0+空格
见a:

重新导入
rx=re.compile(r“\s*(?:\b(?:and | or)\b |[,.])\s*)
strings=[“做蛋糕,遛狗,捡粪便。”,“面粉,蛋白和沙子。”]
对于字符串中的s:
打印(列表(过滤器(无,接收拆分)

注意,逗号或句号通常在“跟随”或“用数字括起来”时被排除在外,您可以考虑用<代码> > [],(..d)< /代码>或<代码> [],(?)]替换<代码> [,] />代码>

\s*(?:\b(?:和|或)\b |[,.])\s*
详情如下:

  • \s*
    -0+空格
  • (?:\b(?:and | or)\b |[,.])
    -一个完整的单词
    ,或逗号/句点
  • \s*
    -0+空格
见a:

重新导入
rx=re.compile(r“\s*(?:\b(?:and | or)\b |[,.])\s*)
strings=[“做蛋糕,遛狗,捡粪便。”,“面粉,蛋白和沙子。”]
对于字符串中的s:
打印(列表(过滤器(无,接收拆分)

注意,逗号或句号通常在“跟随”或“用数字括起来”时被排除在外,您可以考虑用<代码> > [,](..d)< /代码>或<代码> [],(),替换< < > > /代码>(?)?

  • 使用标点符号进行拆分
  • 使用连词进行拆分

这将适用于您提供的两个测试用例

我认为您需要通过以下步骤来处理此问题:

  • 使用标点符号进行拆分
  • 使用连词进行拆分

这将在您提供的测试用例中使用,而不是正则表达式,也可以考虑用逗号替换所有的目标令牌,然后基于逗号、丢弃空格进行拆分。而不是正则表达式,也可以考虑用逗号替换所有的目标令牌,然后基于逗号拆分,丢弃空白。s