我试图使用python正则表达式拆分由方括号分隔的单词/短语。我想拆分输出。条件是以方括号开头和结尾的文本部分将被拆分为不同的元素。
这是我到目前为止所做的,但它没有正常工作:
import re
t="word1 word2 3456 [abc def] [ghi jkl] [1234] [-abcd] word 2345"
re.split("(\[)(.*)(\])+",t)
输出:
['word1 word2 3456 ',
'[',
'abc def] [ghi jkl] [1234] [-abcd',
']',
' word [xyz 2345']
我希望输出类似于:
['word1 word2 3456 ',
'[abc def]',
' ',
'[ghi jkl]',
' ',
'[1234]',
' ',
'[-abcd]',
' word [xyz 2345']
请注意,只有具有左右方括号的项目才会被拆分。
我也试过这个:
re.split("(\[.*\])+",t)
但只能按第一个和最后一个方括号分开
['word1 word2 3456 ', '[abc def] [ghi jkl] [1234] [-abcd]', ' word [xyz 2345']
答案 0 :(得分:4)
使用.+?
代替.*
:
>>> re.split("(\[.+?\])", t)
['word1 word2 3456 ', '[abc def]', ' ', '[ghi jkl]', ' ', '[1234]', ' ', '[-abcd]', ' word 2345']
答案 1 :(得分:3)
您可以使用此正则表达式来拆分字符串:
\s(?=\[)|(?<=\])\s
<强> Working demo 强>
但是因为它会分割这些空格,所以它会消耗它们,你生成的输出将是:
word1 word2 3456
[abc def]
[ghi jkl]
[1234]
[-abcd] word 2345
因此,作为一种解决方法,您可以使用上面的正则表达式将匹配项替换为||| |||
之类的自定义标记,以生成以下内容:
word1 word2 3456||| |||[abc def]||| |||[ghi jkl]||| |||[1234]||| |||[-abcd]||| |||word 2345
然后,您可以在自定义令牌|||
上使用拆分方法,并将空格保持为:
'word1 word2 3456'
' '
'[abc def]'
' '
'[ghi jkl]'
' '
'[1234]'
' '
'[-abcd]'
' '
'word '
答案 2 :(得分:0)
请改为尝试:
re.findall(r"[^\]\[]*|\[[^\]\[]*?\]", t)
这将返回
['word1 word2 3456 ', '', 'abc def', '', ' ', '', 'ghi jkl', '', ' ', '', '1234', '', ' ', '', '-abcd', '', ' word 2345', '']
要删除空字符串,请执行以下操作:
list(filter(None, re.findall(r"[^\]\[]*|\[[^\]\[]*?\]", t)))
返回
['word1 word2 3456 ',
'abc def',
' ',
'ghi jkl',
' ',
'1234',
' ',
'-abcd',
' word 2345']
解释正则表达式:
re.compile(r"""
[^\]\[]* # Zero or more characters that aren't [ or ]
| # OR
\[ # a literal [
[^\]\[]*? # Zero or more characters that aren't [ or ]
\] # a literal ]""", re.X)