2016-08-28 11 views
0

私は以下の文字列を持っています。Python正規表現による支援

例:

  • 12 CG GRB
  • 6GRC 11.2 MK
  • 2 GR 1.75LRG

そして私は、次のグループ

    にそれらを破るしたいと思います
  • [12、CG] [GRB]
  • [6、GRC] [11.2、MK]
  • [2、GR] [1.75、LRG]

私は、この正規表現を使用しています - (\ dは+ \ D *。?)*。? ([AZ] +)でも、最初の例を正しく取り込むことはできません。 [12、CG] [GRB]の代わりに、私は[12、CG]を得る。

ご協力いただければ幸いです。

import re 
p = re.compile(ur'(\d+\.?\d*).*?([A-Z]+)') 
test_str = u"12 CG GRB" 

re.findall(p, test_str) 
+1

に沿ってあなたのコードを投稿してください。質問は – 0xtvarun

+0

あなたの例はあまりにも少なく、それらを見て、私は '(\ d * \?\ d +)を提案できますか?\ s *([A-Z] +) 'ですが、これは必要以上に一致する可能性があります。 –

+0

私はコードを追加しました。 – user3430556

答えて

0

あなたは、ゼロ以上whitespascesに一致するように\s*.*?を交換し、最初のキャプチャグループをオプションにする:

(\d*\.?\d+)?\s*([A-Z]+) 
      ^^^^ 

regex demoを参照してください。

注サブパターン番号の一致を\d*\.?\d+に変更して、.56などのmathc番号にも変更しました。あなたはそれのために独自のパターンを保つかもしれません。

パターンはの詳細:

  • (\d*\.?\d+)? -
    • \d*をキャプチャオプショングループ1 - ゼロ以上の数字
    • \.? - 任意ドット
    • \d+から1桁以上
  • \s* - ゼロ以上の空白。1つ以上の大文字のASCII文字をキャプチャしているグループ2。

re.findalldemo)を使用し、タプルのリストとしてキャプチャグループの内容を取得するには、次の

import re 
p = re.compile(r'(\d*\.?\d+)?\s*([A-Z]+)') 
s = "12 CG GRB\n6GRC 11.2 MK\n2 GR 1.75LRG" 
print(p.findall(s)) 
0
s = "12 CG GRB\n6GRC 11.2 MK\n2 GR 1.75LRG" 
re.split(r"(?<!\d)\s", s) 

出力は次のようになります。

['12 CG', 'GRB', '6GRC', '11.2 MK', '2 GR', '1.75LRG'] 
+1

説明をいくつか追加してください。アイデアはOPを助けることであり、OPのコードを書くのではありません。 –