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(字母)
,然后相应地弹出项目