Python:如何将一个字符串拆分成多个字符串
Python: how to split a string by multiple strings
给定一个字符串:
str = "apple AND orange OR banana"
我想按 "AND" 或 "OR" 拆分。预期结果是
['apple', 'orange', 'banana']
python有什么简单的方法可以做到吗?
谢谢!
您可以使用正则表达式根据大写字母与 len 1 或更多的任意组合进行拆分:
>>> tr = "apple AND orange OR banana"
>>> re.split(r'[A-Z]+',tr)
['apple ', ' orange ', ' banana']
但是如果你只想与 AND
或 OR
分开:
>>> re.split(r'AND|OR',tr)
['apple ', ' orange ', ' banana']
如果你确定你的句子包含不同的词,你可以删除空格:
>>> re.split(r'[A-Z ]+',tr)
['apple', 'orange', 'banana']
如果您在字符串的前导或尾部有一个 AND
或 OR
使用拆分将在结果中创建一个空字符串,为了得到它,您可以遍历拆分列表并检查用于项目验证,但作为一种更优雅的方式,您可以使用 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']
我可以想到两种方法来完成这个:
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']
为什么不这样使用 filter
和 re.split
:
my_list = list(filter(None, re.split("\s*(?:AND|OR)\s*", my_str)))
即使 AND 或 OR 位于字符串的最开头,这也能正常工作。此外,您应该知道 str
是一个非常糟糕的变量名,因为它是一个内置变量名。
这给出了输出:
['apple', 'orange', 'banana']
您可以拆分和筛选一组:
s = "apple AND orange OR banana"
print([word for word in s.split() if word not in {"AND","OR"}])
['apple', 'orange', 'banana']
给定一个字符串:
str = "apple AND orange OR banana"
我想按 "AND" 或 "OR" 拆分。预期结果是
['apple', 'orange', 'banana']
python有什么简单的方法可以做到吗?
谢谢!
您可以使用正则表达式根据大写字母与 len 1 或更多的任意组合进行拆分:
>>> tr = "apple AND orange OR banana"
>>> re.split(r'[A-Z]+',tr)
['apple ', ' orange ', ' banana']
但是如果你只想与 AND
或 OR
分开:
>>> re.split(r'AND|OR',tr)
['apple ', ' orange ', ' banana']
如果你确定你的句子包含不同的词,你可以删除空格:
>>> re.split(r'[A-Z ]+',tr)
['apple', 'orange', 'banana']
如果您在字符串的前导或尾部有一个 AND
或 OR
使用拆分将在结果中创建一个空字符串,为了得到它,您可以遍历拆分列表并检查用于项目验证,但作为一种更优雅的方式,您可以使用 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']
我可以想到两种方法来完成这个:
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']
为什么不这样使用 filter
和 re.split
:
my_list = list(filter(None, re.split("\s*(?:AND|OR)\s*", my_str)))
即使 AND 或 OR 位于字符串的最开头,这也能正常工作。此外,您应该知道 str
是一个非常糟糕的变量名,因为它是一个内置变量名。
这给出了输出:
['apple', 'orange', 'banana']
您可以拆分和筛选一组:
s = "apple AND orange OR banana"
print([word for word in s.split() if word not in {"AND","OR"}])
['apple', 'orange', 'banana']