在字符串中的占位符之间提取和替换子字符串

时间:2012-11-09 20:58:35

标签: python regex

我有一个输入文字,

input = 'I like {sushi} and {tempura}.'

并希望从中获取一个列表和替换的src。

lst = ['sushi', 'tempura']
src = 'I like * and *.'

我可以在输入/输出字符串中使用任何标记,而不是{}*,例如[]或其他内容。

3 个答案:

答案 0 :(得分:8)

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))

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

  • \{ - 寻找文字'{'
  • [^\}] - 匹配任何不是文字'}'
  • 的内容
  • * - 尽可能多地匹配。
  • \} - 匹配文字'}'

添加了括号以在re.findall的匹配中进行分组。


正如DSM所指出的,在令牌之间找到文本的另一个常用习惯是:

r"\{(.*?)\}"

表示:

  • \{ - 匹配文字'{'
  • (.*?) - 匹配任何东西,但不要贪婪 - (不要吃能够用于下一部分比赛的东西)
  • '\}' - 匹配文字'}'

答案 1 :(得分:4)

因为我无法阻止自己试图找到非正则表达式的方法,所以这是一种使用标准字符串格式的方法:

>>> 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 *.'

答案 2 :(得分:0)

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

之间的文字
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的{(.*?)}