Python Regex:两个定界符之间的单词-用标点符号替换前导定界符,但删除结尾的定界符

时间:2018-07-24 20:00:54

标签: python regex

test_str = '**Amount** : $25k  **Name** : James'

预期输出:

output: Amount: $25k, Name: James

我只能使用re.sub函数删除/替换定界符** words,但是无法获得预期的结果。

还有,是否可以泛化要在所有定界符(** xx **,等)上实现的代码?

4 个答案:

答案 0 :(得分:2)

我使用re.sub的方法。第一个re.sub删除了*,第二个re.sub添加了逗号:

import re

test_str = '**Amount** : $25k  **Name** : James'

s = re.sub(r'\s*([^:\s]+)\s*:\s*([^\s]+)', r'\1: \2, ', re.sub(r'[\*\s]+', ' ', test_str)).rstrip(', ')
print(s)

输出:

Amount: $25k, Name: James

使用*,<,>作为分隔符:

test_str = '**Amount** : $25k  **Name** : James <<Name2>> : Another <Name3> : Jack'

s = re.sub(r'\s*([^:\s]+)\s*:\s*([^\s]+)', r'\1: \2, ', re.sub(r'[\*<>\s]+', ' ', test_str)).rstrip(', ')
print(s)

输出:

Amount: $25k, Name: James, Name2: Another, Name3: Jack

答案 1 :(得分:0)

这应该为您工作

st='**Amount** : $25k  **Name** : James'

stage1=re.sub(r"\**","",st)

re.sub(r'(?<=\:\s\S\S\S\S\s)',",",stage1)

输出将为

'Amount : $25k , Name : James'

要匹配正则表达式,您必须查看this one之类的在线正则表达式测试器

答案 2 :(得分:0)

使用lineTo,只需在第一个参数中填写要删除的定界符即可。 re.sub包含[*<>]*<,但是您可以使用所需的任何值填充它。

>

修改

我决不会声称发明了此方法(credit to @unutbu),但它适用于任意数量的键值对。

re.sub('[*<>]','', test_str)
'Amount : $25k  Name : James'

答案 3 :(得分:0)

一个正则表达式,但带有lambda:

re.sub(r"\*|\s(?=:)|(?<=\d)k\s*",lambda m:"k, " if "k" in m.group() else "",test_str)
'Amount: $25k, Name: James'