替换字符串中的多个模式(Markdown 文本)

Posted

技术标签:

【中文标题】替换字符串中的多个模式(Markdown 文本)【英文标题】:Replace Multiple Patterns in a String (Markdown Text) 【发布时间】:2021-12-12 08:23:39 【问题描述】:

我已经阅读了很多关于这个主题的答案,但我确信我的答案有点不同,因为有多个模式搜索和替换。

例子:

names = '1234': 'John Doe',
         '2345': 'Jane Smith',
         '3456': 'Marry Jones'
        
        
message = '''![:Person](1234) ![:Person](2345) \nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in ![:Person](3456) voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'''

def markdown (msg):
    markdown_id = re.compile (r'(?<=\]\()\d+')  # Find 4 digit number
    result = re.sub (markdown_id, replace_name, msg)
    return result
    
def replace_name (matchobj):
    # print (matchobj)
    if matchobj.group (0) in names:
        return names [matchobj.group (0)]
        

markdown (message)
'![:Person](John Doe) ![:Person](Jane Smith) \nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in ![:Person](Marry Jones) voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

我想替换整个字符串

'![:Person](1234) ![:Person](2345) \nLorem...'

'John Doe Jane Smith \nLorem...'

【问题讨论】:

【参考方案1】:

解决方案是通过替换来使用嵌套的正则表达式组

markdown_id = re.compile (r'(?<=\]\()\d+')

markdown_id = re.compile(r'(!\[:\w+\]\((\d+)\))')

第一组在哪里

![:Person](1234)

第二组只是与那个人相关的 4 位数字。

接下来,我将 replace_name 函数更改为:

def replace_name (matchobj):
    print (matchobj.group (1), matchobj.group (2))
    if matchobj.group (2) in names:
        return names [matchobj.group (2)]

结果就是我想要的:

>>> markdown(message)
![:Person](1234) 1234
![:Person](2345) 2345
![:Person](3456) 3456
'John Doe Jane Smith \nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in Marry Jones voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'

【讨论】:

以上是关于替换字符串中的多个模式(Markdown 文本)的主要内容,如果未能解决你的问题,请参考以下文章

一个字符串中替换多个字符怎么做

替换文件中的文本

如何替换字符串中的奇数模式?

在js中,如何替换一个文本中的多个字符?

mustache模板技术初识

python 将字符串中的多个模式替换为提供的字典中的模式。