test_str = '**Amount** : $25k **Name** : James'
预期输出:
output: Amount: $25k, Name: James
我只能使用re.sub函数删除/替换定界符** words,但是无法获得预期的结果。
还有,是否可以泛化要在所有定界符(** xx **,
答案 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'