Python 特殊格式字符串中的正则表达式命名组
Python regex named groups in special formated string
Objective:
- 我输入的字符串之间用逗号和键值分隔
- 我想用名称组编写正则表达式,这样我就可以提取和替换每个 属性
的值
in 字符串 *keyword , property1 = ABC, property2 = 2
我想按名称
查找并替换 property1
和 property2
的值
对于给定的字符串 *keyword , property1 = ABC, property2 = 2
,结果字符串应该是 *keyword , property1 = DEF, property2 = 10
见下方代码
import re
# find property1 in given string and replace its new value
property1 = 'DEF'
# find property2 in given string and replace its new value
property2 = '10'
line1 = '*keyword , property1 = ABC, property2 = 2 '
line2 = '*keyword , property2 = 2, property1 = ABC ' #property2 comes before proeprty1
line3 = '*keyword,property1=ABC,property2= 2' #same as line 1 but without spaces
regex_with_named_group = r'=\s*(.*)\s*,\s*property1=\s*(.*)\s*,'
line1_found = re.search(regex_with_named_group, line1)
line2_found = re.search(regex_with_named_group, line2)
line3_found = re.search(regex_with_named_group, line3)
if line1_found:
print( line1_found.group('property1'), line1_found.group('property2') )
if line2_found:
print( line2_found.group('property1'), line2_found.group('property2') )
if line3_found:
print(line3_found.group('property1'), line3_found.group('property2'))
为了实现您的目标,我建议考虑使用 re.sub 功能。
import re
line0 = '*keyword , fruit=apple, juice= mango'
line1 = '*keyword , property1 = ABC, property2 = 2 '
line2 = '*keyword , property2 = 2, property1 = ABC ' #property2 comes before proeprty1
line3 = '*keyword,property1=ABC,property2= 2' #same as line 1 but without spaces
regex_with_named_group = re.compile(r'(?P<prop>\w+)(?P<map>\s*=\s*)(?P<val>\w+)')
repl = {'fruit':'avocado', 'property1':170}
for l in [line0, line1, line2, line3]:
s = regex_with_named_group.sub(lambda m: m.group('prop') + m.group('map') +
(str(repl[m.group('prop')])
if m.group('prop') in repl
else m.group('val')), l)
print(s)
结果:
*keyword , fruit=avocado, juice= mango
*keyword , property1 = 170, property2 = 2
*keyword , property2 = 2, property1 = 170
*keyword,property1=170,property2= 2
Demo.
Objective:
- 我输入的字符串之间用逗号和键值分隔
- 我想用名称组编写正则表达式,这样我就可以提取和替换每个 属性 的值
in 字符串 *keyword , property1 = ABC, property2 = 2
我想按名称
property1
和 property2
的值
对于给定的字符串 *keyword , property1 = ABC, property2 = 2
,结果字符串应该是 *keyword , property1 = DEF, property2 = 10
见下方代码
import re
# find property1 in given string and replace its new value
property1 = 'DEF'
# find property2 in given string and replace its new value
property2 = '10'
line1 = '*keyword , property1 = ABC, property2 = 2 '
line2 = '*keyword , property2 = 2, property1 = ABC ' #property2 comes before proeprty1
line3 = '*keyword,property1=ABC,property2= 2' #same as line 1 but without spaces
regex_with_named_group = r'=\s*(.*)\s*,\s*property1=\s*(.*)\s*,'
line1_found = re.search(regex_with_named_group, line1)
line2_found = re.search(regex_with_named_group, line2)
line3_found = re.search(regex_with_named_group, line3)
if line1_found:
print( line1_found.group('property1'), line1_found.group('property2') )
if line2_found:
print( line2_found.group('property1'), line2_found.group('property2') )
if line3_found:
print(line3_found.group('property1'), line3_found.group('property2'))
为了实现您的目标,我建议考虑使用 re.sub 功能。
import re
line0 = '*keyword , fruit=apple, juice= mango'
line1 = '*keyword , property1 = ABC, property2 = 2 '
line2 = '*keyword , property2 = 2, property1 = ABC ' #property2 comes before proeprty1
line3 = '*keyword,property1=ABC,property2= 2' #same as line 1 but without spaces
regex_with_named_group = re.compile(r'(?P<prop>\w+)(?P<map>\s*=\s*)(?P<val>\w+)')
repl = {'fruit':'avocado', 'property1':170}
for l in [line0, line1, line2, line3]:
s = regex_with_named_group.sub(lambda m: m.group('prop') + m.group('map') +
(str(repl[m.group('prop')])
if m.group('prop') in repl
else m.group('val')), l)
print(s)
结果:
*keyword , fruit=avocado, juice= mango
*keyword , property1 = 170, property2 = 2
*keyword , property2 = 2, property1 = 170
*keyword,property1=170,property2= 2
Demo.