1

この正規表現のほとんどがダウンしていますが、先読みに問題があります。文字列を郵便番号に分割し、その後に 2 つの文字列または 2 つの数字を続けたいと考えています。数値の形式は次のとおりです。

1
1.5
1.55
11.55

真ん中のビットのテキストは「No minimum」で、3 番目のビットのテキストは「Free」のみです。

例えば

"YO1£ 10無料" ==> YO1; 10; 無料

また

"yo1£ 8£ 0.5" ==> yo1; 8; 0.5

また

"yo1No minimum£ 0.75" ==> yo1; 最低なし。0.75

私はこれで最初のビットを完了しました:

string = "YO1£ 10Free"
patternPostCode = re.compile("[a-zA-Z]{1,2}[0-9][a-zA-Z0-9]?")
postCode = re.findall(string,patternPostCode)

文字列内の数値は、次の方法で検出されます。

patternCost = re.compile(r"(?<=\xa3 )([0-9]|  
[0-9][0-9]|  
[0-9]?[0-9]?.[0-9]|
[0-9]?[0-9]?.[0-9][0-9])")

「or text equals "No minimum"」を patternCost 検索に追加するのが困難です。また、先読み Â を含めることもできません。これを最後に追加しても機能しません:

(?<=\xc2)

どんな助けでも大歓迎です。

4

1 に答える 1

1

私はPython 2.7でこれを思いつきました:

# -*- coding: utf-8 -*-
import re

raw_string = "YO1£ 10.01Free"
string = raw_string.decode('utf-8')
patternPostCode = re.compile(u"^(\w{3}.*)\s+(\d+\.?\d*)(\w+)$",flags=re.UNICODE)
postCode = patternPostCode.findall(string)

print postCode
print u'; '.join(postCode[0])

これは以下を返します:

[(u'YO1\xc2\xa3', u'10.01', u'Free')]
YO1£; 10.01; Free

まず、SO からコピーした生の文字列がバイト文字列のように見えたので、それを Unicode にデコードする必要がありました (バイト文字列と Unicode 文字列を参照してください。Python )。一般的に、Unicode エンコーディング エラーが発生している可能性があると思います。Â 記号は、その古典的な証拠です。

次に、 re.UNICODE フラグを使用して、正規表現をユニコード対応にしました。これは、Unicode に適した方法で \w を「英数字」を意味し、\d を「数字」を意味するために使用できることを意味します。

http://docs.python.org/2/library/re.html#module-re

正規表現は回線ノイズと間違われることが多いため、解凍してください:

u"^(\w{3}.*)\s+(\d+\.?\d*)(\w+)$"
  • ^ = 行頭
  • (\w{3}.*) = 正確に 3 文字の英数字 (\w{3}) に一致し、その後に何か (.*) が続き、グループ化されます (全体を括弧で囲みます)。私は一般的に .* が好きではありませんが、£ ジャンクを取得する必要がありました。不要な場合は、括弧の外に移動してください。
  • \s+ - 少なくとも 1 つのスペース。私たちはこれを捨てます
  • (\d+.?\d*) - 1 つまたは複数の数字に一致し、オプションでピリオドが続き、オプションで 1 つまたは複数の数字が続きます。これは、10、10.、10.0、10.0000 などに一致します。
  • (\w+) - 1 つ以上の英数字
  • $ - 行末に一致

これは確かに、私がこれまでに書いた中で最もきれいな正規表現ではありませんが、うまくいけば、それで十分に始めることができます。

于 2012-12-04T02:21:55.813 に答える