2

string を考えてみましょうs = "aa,bb11,22 , 33 , 44,cc , dd "

Pythonの正規表現モジュールs使用して、次のトークンのリストに分割したいと思います。これは、Perl が提供する機能に似ています。

  1. "aa,bb11"
  2. "22"
  3. "33"
  4. "44,cc , dd "

ノート:

  • コンマでトークン化したいのですが、それらのコンマの両側に数字がある場合に限ります。
  • 私が対象としているこれらの「数字のカンマ」の周りの(オプションの)空白は、結果から削除する必要があります。オプションの空白は、複数のスペースにすることができます。
  • その他の空白は、元の文字列に表示されているとおりに残す必要があります。

これまでの私の最善の試みは次のとおりです。

import re

pattern = r'(?<=\d)(\s*),(\s*)(?=\d)'
s = 'aa,bb11,22 , 33 , 44,cc , dd '

print re.compile(pattern).split(s)

しかし、これは次のように出力します:

['aa,bb11', '', '', '22', ' ', ' ', '33', ' ', ' ', '44,cc , dd ']

私が欲しいものが4つリストに含まれているので、これは私が欲しいものに近い. 空の文字列とスペース/コンマのみで構成される文字列をすべて削除することもできますが、これらすべてを実行する単一行の正規表現が必要です。

何か案は?

4

4 に答える 4

2

にキャプチャ グループを配置しないでください\s*

pattern = r'(?<=\d)\s*,\s*(?=\d)'
于 2012-07-22T15:46:01.347 に答える
0

\s* をグループ化しないでください。それらはキャプチャされず、出力に書き込まれません。

>>> import re
>>> s = 'aa,bb11,22 , 33 , 44,cc , dd '
>>> re.compile(r'(?<=\d)(\s*),(\s*)(?=\d)').split(s)
['aa,bb11', '', '', '22', ' ', ' ', '33', ' ', ' ', '44,cc , dd ']
>>> re.compile(r'(?<=\d)\s*,\s*(?=\d)').split(s)
['aa,bb11', '22', '33', '44,cc , dd ']
于 2012-07-22T15:53:48.000 に答える
0

正規表現と分割を使用する必要はありません。これは複雑すぎます。これを見る>>

import re
s = "aa,bb11,22 , 33 , 44,cc , dd "
result = re.findall(ur"(?:^\s*|(?<=\d)\s*,\s*)(.*?)(?=\s*,\s*\d|\s*$)", s)
print(result)

出力:

['aa,bb11', '22', '33', '44,cc , dd']

ここでテストします

于 2012-07-22T15:56:31.210 に答える
0

キャプチャ括弧を使用しています。その間の余分な空白は、次の(\s*)ように非キャプチャ括弧を使用できる2 つによってキャプチャされたものです。

r'(?<=\d)(?:\s*),(?:\s*)(?=\d)'

ただし、括弧は実際にはまったく必要ありません

于 2012-07-22T16:03:04.317 に答える