0

AndroidManifest.xml のチャネル名を置き換えて、リリース用のチャネル apk パッケージのグループをバッチ生成しようとしています。

<meta-data android:value="CHANNEL_NAME_TO_BE_DETERMINED" android:name="UMENG_CHANNEL"/> 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

それは明らかに私の必要ではない全体<meta-data android:value="CHANNEL_NAME_TO_BE_DETERMINED" android:name="UMENG_CHANNEL"/>を置き換えます。androidmarket次に、問題がpattern.match(each_config_line)一致結果を返すことであり、結果グループの1つが「CHANNEL_NAME_TO_BE_DETERMINED」であることがわかりました。また、いくつかの置換実装機能を提供しようとしましたが、それでも失敗しました。

では、パターンを見つけることに成功したので、一致した結果グループ要素を正しく置き換えるにはどうすればよいでしょうか?

4

3 に答える 3

1

別のアプローチをお勧めします。xml をテンプレートとして保存し、プレースホルダーを標準の Python 文字列操作に置き換えます。

例えば

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
于 2012-05-04T07:28:42.687 に答える
0

メタデータタグの値だけをキャプチャするには、正規表現を変更する必要があります。

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

具体的には、この部分を変更しました。

\"(.*)\"-これは貪欲な一致であるため、残りの式が一致する限り、先に進んでできるだけ多くの文字に一致します

\"([^"]*)\"-これは、二重引用符ではないものと一致します。一致する結果は、引き続き最初のキャプチャグループに含まれます

置き換えを行いたい場合は、同じままにしておきたいものをキャプチャすることをお勧めします。私はPythonの専門家ではありませんが、おそらく次のように機能します。

re.sub(r'(<meta-data\sandroid:value=\")[^"]*(\"\sandroid:name=\"UMENG_CHANNEL\".*)'
, r'\1YourNewValue\2', s)

\1後方参照1-つまり、最初のキャプチャグループが一致したものを取得します

于 2012-05-04T07:15:20.940 に答える
0

あなたの誤解は、一致したものはすべて置き換えられるということだと思います。パターンから何かを保持したい場合は、それをキャプチャして、置換文字列に再挿入する必要があります。

または、ルックアラウンド アサーションを使用して、置き換えたいものだけを一致させます

これを試して

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)

(?<=<meta-data\sandroid:value=\")は肯定的な後読みアサーションであり、このテキストが前にあることを保証しますが、一致しません (したがって、置き換えられません)。

[^"]+ではないものすべてに一致します。"

ここでRegexrを参照してください

于 2012-05-04T07:32:52.093 に答える