我正在尝试使用 re.split() 来设置对这种形式的字符串的一些粗略解析:
chord = "{<c,,4-^ f' a>8}"
(输入字符串可能会或可能不包含任何括号字符之前或之后的空格,因此例如它可以是: chord = "{ < c,,4-^ f' a> 8}
。此外,括号不会出现在每个输入字符串中,因此字符串可能以 'c 开头, ' 'f'、'a'、'3' 等)
我想要从上面的示例字符串中得到以下结果:
"{","<","c,,4-^","f'","a",">","8","}"
也就是说,字符串应该在空格上分割,在结果中应该被忽略/省略,并且还应该在各种括号字符上分割——但括号应该保留在结果中。到目前为止,我为 re.split() 编写正则表达式字符串的所有努力都产生了无关的单独的空字符串/无项目。我看到几个关于 re.split 相关问题的问题,但我读到的所有内容都围绕限制点和星号 (.*) 运算符 - 例如My regex is matching too much. How do I make it stop? 。我既不使用点也不使用星号。
在测试了 ord 表达式的不同组合后,我怀疑这里可能存在两个单独的问题:
(1) re.split 将空字符串放入结果中的左大括号后面,但不在尖括号或右括号处:
re.split(r'(<|{)',chord) --> "","{","","<","c,, (...)
我尝试在输入字符串中添加第二个 {,在输入中添加 f 前缀,并在正则表达式中转义 {;都给出相同的结果。 (初始空字符串出现在我测试过的每个分割字符的结果中,当它出现在字符串开头时 - 这是预期的吗?)
(2) 当空白查找器在括号之外的 ( |
) 中进行或操作时,一切都乱了套。所以re.split(r'\s+|(<|{|})',chord)
结果列表中的 21 项中,其中 9 项是 ""
或None
。我试过(?:\s+)
, 没有运气。 (是否可以组合捕获组和非捕获组?)
由于我正在处理大量这些字符串,因此我不想在解析过程中检查空字符串和 None 。有什么建议,无论是基于 re.split 还是其他方式,以尽可能经济地实现预期结果?
(就目前情况而言,我计划在输入字符串上使用 str.split() ,然后对每个结果项循环运行 re.split ,知道我需要做额外的内务处理来跟踪是否以及如何这些结果字符串被 re.split 进一步划分。)
最佳答案
假设这些符号{}<>
是你想要拆开的那些。您可以将任何不包含任何先前字符的标记与 [^{<>}\s]+
之类的内容相匹配。当然,您可以将任何字符与 [{}<>]
之类的内容相匹配。 。
那么整个正则表达式将是 [^{<>}\s]+|[{}<>]
。举个例子:
>>> import re
>>> chord = "{<c,,4-^ f' a>8}"
>>> re.findall(r'[^{<>}\s]+|[{}<>]', chord)
['{', '<', 'c,,4-^', "f'", 'a', '>', '8', '}']
>>>
希望有帮助。
关于python - 使用 Python 正则表达式,如何在结果中不出现空字符串的情况下将该字符串拆分为多个分隔符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57797128/