Python字符串分割——按起始和结束字符分割

5
假设你有这样一个字符串:"(hello) (yes) (yo diddly)",你想得到这样一个列表:["hello", "yes", "yo diddly"]。如何在Python中实现呢?

3
这个问题不是很清楚。选择分割位置的标准是什么?你是要找括号内的字符串吗?还是固定位置?你能相信空格总会在那里吗?如果可以,那么始终只有一个空格吗? - Ori Pessach
3个回答

12
import re
pattern = re.compile(r'\(([^)]*)\)')
模式匹配您字符串中的括号(\(...\)),这些需要转义。然后定义了一个子组((...))-这些括号是正则表达式语法的一部分。子组匹配除右括号之外的所有字符([^)]*)。
s = "(hello) (yes) (yo diddly)"
pattern.findall(s)

提供

['hello', 'yes', 'yo diddly']

更新:
使用[^)]+可能比[^)]*更好。后者将匹配一个空字符串。

如DSM所建议的,使用非贪婪修饰符可能使模式更易读:pattern = re.compile(r'\((.+?)\)')


这种方法与使用 ? 相比有什么优势吗? - DSM
@DSM 我不确定 - 但使用非贪婪语法可能更清晰。我会以这种方式更新我的答案。 - tzelleke

11

我会这样做:

"(hello) (yes) (yo diddly)"[1:-1].split(") (")

首先,我们切掉第一个和最后一个字符(因为它们应该被移除)。接下来,我们使用“) (“作为分隔符将结果字符串分割,得到所需的列表。


我需要等待6分钟,请稍等 ;) - Name McChange
2
使用正则表达式的答案更加灵活。如果字符串以空格开头或结尾,或者在括号之间有多个空格或制表符,则此答案将不会产生正确的输出。 - Roland Smith
1
非常正确。我在这个答案中故意避免使用正则表达式,因为我认为可以通过更简单的方法实现解决方案。当然,如果OP需要更多的灵活性,他们可以使用它们,就像你提到的那样。 - arshajii

4
这将从任何字符串中提取单词:
>>> s="(hello) (yes) (yo diddly)"
>>> import re
>>> words = re.findall(r'\((.*?\))',s)
>>> words
['hello', 'yes', 'yo diddly']

作为D.S.M所说。
在正则表达式中使用?使其变为非贪婪模式。

我认为他希望在数组中有一个条目是“yo diddly”。 - arshajii
@DSM,你不需要内部的括号。 - vivek
@vivek:但如果你不使用它们,那么你就会留下括号。将你的输出与期望的输出进行比较。 - DSM

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