Python:如何通过多个字符串拆分一个字符串

4

给定一个字符串:

str = "apple AND orange OR banana"

我想要按照"AND"或者"OR"拆分它。期望的结果是

['apple', 'orange', 'banana']

有没有一种简单的方法可以在Python中实现呢?

谢谢!


4
请不要使用 str 作为变量名。str 是一个众所周知的内置函数,如果覆盖它,将会引发各种问题。请使用其他名称来命名你的变量。 - dhke
4个回答

7
你可以使用正则表达式根据长度为1或更多的大写字母组合进行拆分:

>>> tr = "apple AND orange OR banana"
>>> re.split(r'[A-Z]+',tr)
['apple ', ' orange ', ' banana']

但如果您只想使用ANDOR进行拆分:

>>> re.split(r'AND|OR',tr)
['apple ', ' orange ', ' banana']

如果您确定句子中包含不同的单词,可以使用以下方法删除空格:

>>> re.split(r'[A-Z ]+',tr)
['apple', 'orange', 'banana']

如果你的字符串开头或结尾有ANDOR,使用split方法会在结果中创建一个空字符串。为了去掉这个空字符串,你可以循环遍历分割后的列表并检查每个元素是否有效。但更优雅的方式是使用re.findall方法,并将模式设为r'[^A-Z ]+'
>>> tr = "AND apple AND orangeOR banana"
>>> re.split(r'\s?(?:AND|OR)\s?',tr)
['', 'apple', 'orange', 'banana']
>>> re.split(r'[A-Z ]+',tr)
['', 'apple', 'orange', 'banana']
>>> [i for i in re.split(r'[A-Z ]+',tr) if i]
['apple', 'orange', 'banana']
>>> re.findall(r'[^A-Z ]+',tr)
['apple', 'orange', 'banana']

1
使用 '\s+(AND|OR)\s+',空格也被去掉了;-) - dhke
如果字符串的开头或结尾有OR或AND,您的最后一段代码将失败。 - Padraic Cunningham
@PadraicCunningham 是的!我错过了 ? 但是我修正了答案!更好了! - Mazdak

3
我可以想到两种方法来实现这个目标:
In [230]: s = "apple AND orange OR banana"

In [231]: delims = ["AND", "OR"]

In [232]: for d in delims:
   .....:     s = s.replace(d, '-')
   .....:     

In [233]: s.split('-')
Out[233]: ['apple ', ' orange ', ' banana']

或者

In [234]: s = "apple AND orange OR banana"

In [235]: delims = ["AND", "OR"]

In [236]: for d in delims:
   .....:     s = s.replace(d, ' ')
   .....:     

In [237]: s.split()
Out[237]: ['apple', 'orange', 'banana']

除了使用两个 for 循环,这是我能想到的最干净的方法。 - James Mertz
你需要找到一个在你的字符串中不存在的分隔符,这可能是具有挑战性的。 - Antoine Magron

2
您可以使用集合进行拆分和过滤操作:
s = "apple AND orange OR banana"

print([word for word in s.split() if word not in {"AND","OR"}])

['apple', 'orange', 'banana']

1
为什么不像这样使用filterre.split呢:
my_list = list(filter(None, re.split("\s*(?:AND|OR)\s*", my_str)))

即使在字符串的开头是AND或OR的情况下,这也可以工作。此外,您应该知道 str 是一个非常糟糕的变量名,因为它是内置的。
这将输出:
['apple', 'orange', 'banana']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接