Python 在字符串中匹配多个模式

Python 在字符串中匹配多个模式,python,regex,Python,Regex,我有一个字符串,看起来像这样: s = "[A] text [B] more text [C] something ... [A] hello" 基本上,它由[X]字符组成,我试图在每个[X]之后获取文本 我想给出这句话(我不在乎顺序): 我在考虑一个正则表达式,但我不确定这是否是正确的选择,因为在我的例子中,[a]、[B]和[C]的顺序可以改变,所以这个字符串也是有效的: s = "[A] hello, [C] text [A] more text [B] something" 我不知道如

我有一个字符串,看起来像这样:

s = "[A] text [B] more text [C] something ... [A] hello"
基本上,它由
[X]字符组成,我试图在每个
[X]
之后获取文本

我想给出这句话(我不在乎顺序):

我在考虑一个正则表达式,但我不确定这是否是正确的选择,因为在我的例子中,[a]、[B]和[C]的顺序可以改变,所以这个字符串也是有效的:

s = "[A] hello, [C] text [A] more text [B] something"
我不知道如何正确地提取字符串。谁能给我指一下正确的方向吗?谢谢

预期输出:
mydict={“A”:“text,hello”,“B”:“more text”,“C”:“something”}

>>{'A':'text,hello','B':'more text','C':'something'}

预期输出:
mydict={“A”:“text,hello”,“B”:“more text”,“C”:“something”}


>>{'A':'text,hello','B':'more text','C':'something'}

不确定这是否正是您要查找的内容,但重复项失败

s = "[A] hello, [C] text [A] more text [B] something"

results = [text.strip() for text in re.split('\[.\]', s) if text]

letters = re.findall('\[(.)\]', s)

dict(zip(letters, results))

{'A': 'more text', 'B': 'something', 'C': 'text'}
由于输出如下所示:

In [49]: results
Out[49]: ['hello,', 'text', 'more text', 'something']

In [50]: letters
Out[50]: ['A', 'C', 'A', 'B']
要解决重复问题,您可以执行以下操作

mappings = {}

for pos, letter in enumerate(letters):
    try:
        mappings[letter] += ' ' + results[pos]
    except KeyError:
        mappings[letter] = results[pos]
它给出:
{'A':'hello,more text','B':'something','C':'text'}

更新


或者更好的是,您可以使用默认dict:如下所示:

不确定这是否正是您要查找的,但它会因重复而失败

s = "[A] hello, [C] text [A] more text [B] something"

results = [text.strip() for text in re.split('\[.\]', s) if text]

letters = re.findall('\[(.)\]', s)

dict(zip(letters, results))

{'A': 'more text', 'B': 'something', 'C': 'text'}
由于输出如下所示:

In [49]: results
Out[49]: ['hello,', 'text', 'more text', 'something']

In [50]: letters
Out[50]: ['A', 'C', 'A', 'B']
要解决重复问题,您可以执行以下操作

mappings = {}

for pos, letter in enumerate(letters):
    try:
        mappings[letter] += ' ' + results[pos]
    except KeyError:
        mappings[letter] = results[pos]
它给出:
{'A':'hello,more text','B':'something','C':'text'}

更新


或者更好的方法是使用默认的dict:如下所示:

这里有一个简单的解决方案:

#/usr/bin/python
进口稀土
s=“[A]文本[B]更多文本[C]内容…[A]您好”
d=dict()
对于re.findall(r“\[^\]+]\][^\[]*”中的x,s):
m=re.match(r“\[([^\]*])\](.*),x)
如果不是d.get(m.group(1),0):
#密钥不存在
d[m.组(1)]=m.组(2)
其他:
d[m.group(1)]=%s,%s%(d[m.group(1)],m.group(2))
打印d
印刷品:

{'A': ' text ,  hello', 'C': ' something ... ', 'B': ' more text '}

以下是一个简单的解决方案:

#/usr/bin/python
进口稀土
s=“[A]文本[B]更多文本[C]内容…[A]您好”
d=dict()
对于re.findall(r“\[^\]+]\][^\[]*”中的x,s):
m=re.match(r“\[([^\]*])\](.*),x)
如果不是d.get(m.group(1),0):
#密钥不存在
d[m.组(1)]=m.组(2)
其他:
d[m.group(1)]=%s,%s%(d[m.group(1)],m.group(2))
打印d
印刷品:

{'A': ' text ,  hello', 'C': ' something ... ', 'B': ' more text '}

你是对的。很抱歉已编辑。您是否尝试使用re.findall查找输入字符串中的每个“[X]字符”,然后使用re.match检索X和字符?您是对的。很抱歉已编辑。您是否尝试使用re.findall查找输入字符串中的每个“[X]字符”,然后使用re.match检索X和字符?当我注意到OP希望在其dict中加入dup值时,我进行了更新。这很好。如果字符串是
s=“任意文本[A]abc[B]fff[C]…”
,那么“任意文本”也会被提取出来。如何摆脱它?另一件事:如果
[X]
[CAR]
[CAR]
(我想在之后/之前删除空格)获得
[X]
[CAR]
只是将
'\[()\]
更改为
'\[(\w)\]'
以匹配单词的问题。如果你想摆脱领先的结果,你可以作弊并比较
len(结果)
len(字母)
,然后相应地弹出项目。我注意到OP想要在他的dict中加入dup值。这很好。如果字符串是
s=“任意文本[A]abc[B]fff[C]…”
,那么“任意文本”也会被提取出来。如何摆脱它?另一件事:如果
[X]
[CAR]
[CAR]
(我想在之后/之前删除空格)获得
[X]
[CAR]
只是将
'\[()\]
更改为
'\[(\w)\]'
以匹配单词的问题。如果你想摆脱领先的结果,你可以作弊并比较
len(结果)
len(字母)
,然后相应地弹出项目