【问题标题】:Extract and substitute substring between placeholders in string在字符串中的占位符之间提取和替换子字符串
【发布时间】:2012-11-09 20:58:34
【问题描述】:

我有一个输入文本,

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

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

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

我可以在输入/输出字符串中使用任何标记来代替{}*,例如[] 之类的。

【问题讨论】:

  • 是的,lst = ['sushi', 'tempura'] 更准确。对不起,是我的错。

标签: python regex


【解决方案1】:
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"\{(.*?)\}"

意思是:

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

【讨论】:

  • 感谢您的详细回答。我已经尝试过并且得到了我想要的。
  • @koichi_n -- 我很乐意提供帮助。这里有些人比我更擅长正则表达式——如果有更清洁的方法来做这件事,我不会感到惊讶,但它似乎工作得很好:)
  • @DSM -- 是的。这是我见过的另一种常见的习惯用法,用于将一个标记匹配到另一个标记。
  • @DSM -- 我将您的正则表达式添加到我的答案中,并附有解释(和引用)。谢谢!
【解决方案2】:

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

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

【讨论】:

  • +1。我想出了如何在没有正则表达式的情况下完成第二部分,但我无法获得第一部分。做得很好。
【解决方案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 答案显示或来自 DSM 的 {(.*?)}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 2021-11-05
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多