我有一个输入文字,
input = 'I like {sushi} and {tempura}.'
并希望从中获取一个列表和替换的src。
lst = ['sushi', 'tempura']
src = 'I like * and *.'
我可以在输入/输出字符串中使用任何标记,而不是{}
和*
,例如[]
或其他内容。
答案 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的{(.*?)}
。