2012-05-03 19 views
4

可能性の重複:
Python: Split string with multiple delimiters分割文字列を複数の区切り文字で区切っていますか?

は、私はPythonで似た何かを行うことができますか?

VB.netでの分割方法:このような不正なデータ形式を考えると

Dim line As String = "Tech ID: xxxxxxxxxx Name: DOE, JOHN Account #: xxxxxxxx" 
Dim separators() As String = {"Tech ID:", "Name:", "Account #:"} 
Dim result() As String 
result = line.Split(separators, StringSplitOptions.RemoveEmptyEntries) 
+0

便利複製、IMO:コメントの正規表現として

。 –

答えて

2

、あなたはre.split()を試みることができる:

>>> import re 
>>> mystring = "Field 1: Data 1 Field 2: Data 2 Field 3: Data 3" 
>>> a = re.split(r"(Field 1:|Field 2:|Field 3:)",mystring) 
['', 'Field 1:', ' Data 1 ', 'Field 2:', ' Data 2 ', 'Field 3:', ' Data 3'] 

データがsanelyフォーマットした場合はあなたの仕事がはるかに容易になるだろう引用符で囲まれた文字列とコンマで区切られたレコードを持ちます。これにより、カンマ区切りの値ファイルの解析にcsvモジュールを使用することができます。

編集:

リストの理解度で空白のエントリを除外することができます。

>>> a_non_empty = [s for s in a if s] 
>>> a_non_empty 
['Field 1:', ' Data 1 ', 'Field 2:', ' Data 2 ', 'Field 3:', ' Data 3'] 
+0

ありがとう!私はデータ形式について知っています。残念ながら、それは私が作ろうとしているCSV変換へのPITA pdfです。 – fpena06

+0

少し詳しく説明できますか?私は非常に新しく、あなたのコードを理解していません。 – fpena06

1
>>> import re 
>>> str = "Tech ID: xxxxxxxxxx Name: DOE, JOHN Account #: xxxxxxxx" 
>>> re.split("Tech ID:|Name:|Account #:",str) 
['', ' xxxxxxxxxx ', ' DOE, JOHN ', ' xxxxxxxx'] 
+0

'split 'トークン自体があなたの出力に現れないのはなぜですか? Python 2とPython 3の違いは? –

+0

それは良い質問です。私はそれをキャッチしませんでした。 – fpena06

+3

@ Li-aungYip::)実際には、Pythonのバージョンとは関係ありません。ちょうど、彼らは捕まえられなかったので、パターンを '(...) 'で囲んでいませんでした。 – codaddict

0

私は別のアプローチを示唆している:辞書:あなたはこの種のデータのための有用なデータ構造を取得

>>> import re 
>>> subject = "Tech ID: xxxxxxxxxx Name: DOE, JOHN Account #: xxxxxxxx" 
>>> regex = re.compile(r"(Tech ID|Name|Account #):\s*(.*?)\s*(?=Tech ID:|Name:|Account #:|$)") 
>>> dict(regex.findall(subject)) 
{'Tech ID': 'xxxxxxxxxx', 'Name': 'DOE, JOHN', 'Account #': 'xxxxxxxx'} 

その方法を。

regex = re.compile(
    r"""(?x)       # Verbose regex: 
    (Tech\ ID|Name|Account\ \#)  # Match identifier 
    :        # Match a colon 
    \s*        # Match optional whitespace 
    (.*?)       # Match any number of characters, as few as possible 
    \s*        # Match optional whitespace 
    (?=        # Assert that the following can be matched: 
    Tech\ ID:|Name:|Account\ \#: # The next identifier 
    |$        # or the end of the string 
    )        # End of lookahead assertion""") 
+0

これは識別子を繰り返すので、私にとっては良いアプローチではありません。 – jamylak

+0

@jamylak:私は知っていますが、値が終わったときに他にどのようにして伝えることができますか?区切り記号を保存することができればそれははるかに良いでしょうが、それはオプションではないようです。 –

関連する問題