Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
匹配组的python正则表达式替换_Python_Regex - Fatal编程技术网

匹配组的python正则表达式替换

匹配组的python正则表达式替换,python,regex,Python,Regex,我试图用AndroidManifest.xml替换通道名称,以批量生成一组通道apk包以供发布 从xml文件 频道配置保存在配置文件中,如: channel_name output_postfix valid "androidmarket" "androidmarket" true 以下是我尝试过的: manifest_original_xml_fh = open("../AndroidManifest_original.xml", "r") manifest_xml_fh = o

我试图用AndroidManifest.xml替换通道名称,以批量生成一组通道apk包以供发布

从xml文件

频道配置保存在配置文件中,如:

channel_name    output_postfix  valid 
"androidmarket" "androidmarket" true
以下是我尝试过的:

manifest_original_xml_fh = open("../AndroidManifest_original.xml", "r")
manifest_xml_fh = open("../AndroidManifest.xml", "w")
pattern = re.compile('<meta-data\sandroid:value=\"(.*)\"\sandroid:name=\"UMENG_CHANNEL\".*')
for each_config_line in manifest_original_xml_fh:
    each_config_line = re.sub(pattern, channel_name, each_config_line) 
    print each_config_line
manifest\u original\u xml\u fh=open(“../AndroidManifest\u original.xml”,“r”)
manifest\u xml\u fh=open(“../AndroidManifest.xml”,“w”)

pattern=re.compile(“要仅捕获元数据标记的值,需要更改正则表达式:

<meta-data\sandroid:value=\"([^"]*)\"\sandroid:name=\"UMENG_CHANNEL\".*

\1
是反向引用1-也就是说,它获取第一个捕获组匹配的内容

我建议另一种方法:将xml保存为模板,用标准Python字符串操作替换占位符

例如

AndroidManifest\u template.xml:
蟒蛇:
manifest\u original\u xml\u fh=open(“../AndroidManifest\u template.xml”,“r”)
manifest\u xml\u fh=open(“../AndroidManifest.xml”,“w”)
对于清单\u原始\u xml\u fh中的每个\u配置\u行:
每个配置行=每个配置行%{'channel\u name':channel\u name}
打印每个配置行

我认为您的误解是,所有匹配的内容都将被替换。如果您想保留模式中的内容,您必须捕获它并将其重新插入替换字符串中

或使用环顾断言仅匹配要替换的内容

试试这个

pattern = re.compile('(?<=<meta-data\sandroid:value=\")[^"]+')
for each_config_line in manifest_original_xml_fh:
    each_config_line = re.sub(pattern, channel_name, each_config_line)

pattern=re.compile(”(?我现在不知道您想做什么,那么您的预期输出是什么?我想您的误解是,所有匹配的内容都将被替换。如果您想保留模式中的内容,您必须捕获它并将其重新插入替换字符串中。(或者使用lookaround断言不匹配这些内容)为了让问题更清楚,我想提一下:这里CHANNEL\u NAME\u To\u BE\u DETERMINED是动态的,我需要的是将它替换为一些配置的CHANNEL NAME。谢谢你的回复。我所做的匹配似乎没有问题。匹配的结果组元素是CHANNEL\u NAME\u To\u BE\u DETERMINED,我只想替换这个匹配的结果组元素对某个频道名称的ent。对您的第二个解决方案非常有效。很好的解决方法。事实上,这就是我所做的。我只是很好奇如何直接解决它。非常简洁有效的解决方案。以前从未听说过积极的后顾断言,现在已经学会了。谢谢。
AndroidManifest_template.xml:

<meta-data android:value="%(channel_name)s" android:name="UMENG_CHANNEL"/>

python:

manifest_original_xml_fh = open("../AndroidManifest_template.xml", "r")
manifest_xml_fh = open("../AndroidManifest.xml", "w")
for each_config_line in manifest_original_xml_fh:
    each_config_line = each_config_line % {'channel_name': channel_name}
    print each_config_line
pattern = re.compile('(?<=<meta-data\sandroid:value=\")[^"]+')
for each_config_line in manifest_original_xml_fh:
    each_config_line = re.sub(pattern, channel_name, each_config_line)