1

次のような文字列を解析したい:

package: name='jp.tjkapp.droid1lwp' versionCode='2' versionName='1.1'
uses-permission:'android.permission.WRITE_APN_SETTINGS'
uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED'
uses-permission:'android.permission.ACCESS_NETWORK_STATE'

私は手に入れたい:

string1: jp.tjkapp.droidllwp`

string2: 1.1

複数の uses-permission があるため、次を含むリストとして許可を取得したい: WRITE_APN_SETTINGSと.RECEIVE_BOOT_COMPLETEDACCESS_NETWORK_STATE

必要な文字列を取得するための Python 正規表現の記述を手伝ってもらえますか? ありがとう。

4

3 に答える 3

1

あなたが提供したコード ブロックが 1 つの長い文字列であると仮定すると、ここでは という変数に格納されますinput_string

name = re.search(r"(?<=name\=\')[\w\.]+?(?=\')", input_string).group(0)
versionName = re.search(r"(?<=versionName\=\')\d+?\.\d+?(?=\')", input_string).group(0)
permissions = re.findall(r'(?<=android\.permission\.)[A-Z_]+(?=\')', input_string)

説明:

名前

  • (?<=name\=\'):が先行する文字列のみを返すために、メイン文字列のにチェックを入れname='ます。\前のと='それらをエスケープするのに役立ち=、正規表現コマンドではなく文字列について話していることを正規表現が認識できるようにします。 name='結果を取得したときに も返されません。取得した結果はすべてそれが先行していることがわかります。
  • [\w\.]+?: これは、検索している主な文字列です。\w任意の英数字とアンダースコアを意味します。 はエスケープされたピリオドであるため、正規表現は、エスケープされていないピリオドによって表される正規表現コマンドではなく、\.私たちが意味することを認識しています。.これらを[]入れるということは、括弧でくくったものは何でも構わないことを意味するので、任意の英数字、_、または.. +あとがきは、前のものの少なくとも 1 つを意味し、少なくとも 1 つ (場合によってはそれ以上) を意味し[\w\.]ます。最後に、?手段は貪欲にならないでください。これらの仕様を満たす最小のグループを取得するように正規表現に指示しています。+[\w\.].
  • (?=\'):が続く文字列のみを返すために、メインの文字列の後ろをチェックし'ます。そうしないと、正規表現または Python の文字列の\実行によって が誤って解釈される可能性があるため、 もエスケープ'です。この最終的な結果'は結果とともに返されません。元の文字列で、最終的に得られる結果に続いていることがわかっているだけです。
于 2012-10-16T06:09:47.877 に答える
0

ここにコードの例があります

#!/usr/bin/env python
inputFile = open("test.txt", "r").readlines()
for line in inputFile:
    if line.startswith("package"):
        words = line.split()
        string1 = words[1].split("=")[1].replace("'","")
        string2 = words[3].split("=")[1].replace("'","")

test.txt ファイルには、前述の入力データが含まれています。

于 2012-10-16T21:13:33.410 に答える
0

You can do this without regex by reading the file content line by line.

>>> def split_string(s):
...     if s.startswith('package'):
...             return [i.split('=')[1] for i in s.split() if "=" in i]
...     elif s.startswith('uses-permission'):
...             return s.split('.')[-1]
... 
>>> split_string("package: name='jp.tjkapp.droid1lwp' versionCode='2' versionName='1.1'")
["'jp.tjkapp.droid1lwp'", "'2'", "'1.1'"]
>>> split_string("uses-permission:'android.permission.WRITE_APN_SETTINGS'")
"WRITE_APN_SETTINGS'"
>>> split_string("uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED'")
"RECEIVE_BOOT_COMPLETED'"
>>> split_string("uses-permission:'android.permission.ACCESS_NETWORK_STATE'")
"ACCESS_NETWORK_STATE'"
>>> 
于 2012-10-16T06:19:40.570 に答える