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

2024-09-30 00:24:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个输入文本

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

想从中得到一个列表和一个替换的src。在

^{pr2}$

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


Tags: and字符串标记文本src列表inputlike
3条回答

一个易于理解的方法,它匹配{}之间的文本

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 answer所示,或来自DSM的{(.*?)}。在

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)

也可以使用字符串格式进行替换:

^{pr2}$

regex分解(注意我使用了一个原始字符串[r'...']):

  • \{查找文本{
  • [^\}]匹配任何不是文本'}'
  • *尽可能多地匹配它。在
  • \}匹配文本'}'

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


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

^{3}$

也就是说:

  • \{匹配文本{
  • (.*?)匹配任何内容,但不要贪心(不要吃re在下一个匹配部分可以使用的东西)
  • '\}'匹配文本'}'

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

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

相关问题 更多 >

    热门问题