Python 提取并替换字符串中占位符之间的子字符串

Python 提取并替换字符串中占位符之间的子字符串,python,regex,Python,Regex,我有一个输入文本 input = 'I like {sushi} and {tempura}.' 想从中得到一个列表和一个替换的src lst = ['sushi', 'tempura'] src = 'I like * and *.' 我可以在输入/输出字符串中使用任何标记,而不是{}和*,例如[]或其他东西 import re input = 'I like {sushi} and {tempura}.' regex = re.compile(r'\{([^\}]*)\}') lst =

我有一个输入文本

input = 'I like {sushi} and {tempura}.'
想从中得到一个列表和一个替换的src

lst = ['sushi', 'tempura']
src = 'I like * and *.'
我可以在输入/输出字符串中使用任何标记,而不是
{}
*
,例如
[]
或其他东西

import re
input = 'I like {sushi} and {tempura}.'
regex = re.compile(r'\{([^\}]*)\}')
lst = regex.findall(input)            #['sushi','tempura']
mod_str = regex.sub('*',input)        #I like * and *.
print (lst)
print (mod_str)
您还可以使用字符串格式进行替换:

mod_str = input.format(**dict((x,'*') for x in lst))
>>> import string
>>> s = 'I like {sushi} and {tempura}.'
>>> parsed = string.Formatter().parse(s)
>>> fields = [p[1] for p in parsed if p[1]]
>>> src = s.format(**{f: '*' for f in fields})
>>> fields
['sushi', 'tempura']
>>> src
'I like * and *.'

正则表达式分解(注意我使用了一个原始字符串[
r'…'
]):

  • \{
    --查找文字'{'
  • [^\}]
    --匹配任何不是文字'}'的内容
  • *
    ——尽可能多地匹配它
  • \}
    --匹配文字'}'
添加括号以在
re.findall
的匹配中进行分组


正如DSM所指出的,在标记之间查找文本的另一个常见习惯用法是:

r"\{(.*?)\}"
这意味着:

  • \{
    --匹配文字'{'
  • (.*)
    ——匹配任何东西,但不要贪心——(不要吃re可以用于下一部分匹配的东西)
  • '\}'
    --匹配文字'}'

一种易于理解的方法,用于匹配
{}

import re

input = 'I like {sushi} and {tempura}'
lst = re.findall('{[(a-zA-Z)]*}',input)
src = re.sub('{[a-zA-Z]*}','*',input)

print lst
['sushi', 'tempura']

print src
I like * and *

如果要匹配
{}
之间的任何内容,则需要使用mgilsons答案显示的
{[^}]*}
或DSM中的
{(.*)}

因为我无法阻止自己尝试找到非正则表达式的方法来完成操作,下面是一种使用标准字符串格式的方法:

mod_str = input.format(**dict((x,'*') for x in lst))
>>> import string
>>> s = 'I like {sushi} and {tempura}.'
>>> parsed = string.Formatter().parse(s)
>>> fields = [p[1] for p in parsed if p[1]]
>>> src = s.format(**{f: '*' for f in fields})
>>> fields
['sushi', 'tempura']
>>> src
'I like * and *.'

是的,lst=[‘寿司’、‘天妇罗’]更准确。对不起,这是我的错。谢谢你详细的回答。我已经试过了,得到了我想要的东西。@koichi_n--我很乐意帮忙。这里有一些人比我更擅长使用正则表达式——如果有更干净的方法来实现这一点,我不会感到惊讶,但它似乎工作得足够好:)@DSM——是的。这是我见过的另一个常用的习惯用法,用于将一个标记匹配到另一个标记。@DSM--我在我的答案中添加了您的正则表达式,并给出了解释(和引用)。谢谢+1.我想出了在没有正则表达式的情况下如何做第二部分,但是我无法得到第一部分。干得好。