web-dev-qa-db-ja.com

Pythonで複数の区切り文字を使って文字列を分割する

私はオンラインでいくつかの答えを見つけました、しかし、私は正規表現について経験がありません。

';'で分割する必要がある文字列があります。つまり、セミコロンかカンマの後にスペースを続ける必要があります。末尾のスペースを含まない個々のコンマはそのまま残してください。

文字列の例:

"b-staged divinylsiloxane-bis-benzocyclobutene [124221-30-3], mesitylene [000108-67-8]; polymerized 1,2-dihydro-2,2,4- trimethyl quinoline [026780-96-1]"

以下を含むリストに分割する必要があります。

('b-staged divinylsiloxane-bis-benzocyclobutene [124221-30-3]' , 'mesitylene [000108-67-8]', 'polymerized 1,2-dihydro-2,2,4- trimethyl quinoline [026780-96-1]') 
380
gt565k

幸いなことに、Pythonにはこの組み込み機能があります。

import re
re.split('; |, ',str)

更新:
あなたのコメントに従う:

>>> a='Beautiful, is; better*than\nugly'
>>> import re
>>> re.split('; |, |\*|\n',a)
['Beautiful', 'is', 'better', 'than', 'ugly']
631
Jonathan

str.replace('; ', ', ')をしてからstr.split(', ')をする

155
Joe

これは、正規表現を使用して、反復可能な区切り文字に対して安全な方法です。

>>> import re
>>> delimiters = "a", "...", "(c)"
>>> example = "stackoverflow (c) is awesome... isn't it?"
>>> regexPattern = '|'.join(map(re.escape, delimiters))
>>> regexPattern
'a|\\.\\.\\.|\\(c\\)'
>>> re.split(regexPattern, example)
['st', 'ckoverflow ', ' is ', 'wesome', " isn't it?"]

re.escape はパターンを自動的に構築し、デリミタをうまくエスケープすることを可能にします。

これがあなたのコピーペーストの喜びのための機能としてのこの解決策です:

def split(delimiters, string, maxsplit=0):
    import re
    regexPattern = '|'.join(map(re.escape, delimiters))
    return re.split(regexPattern, string, maxsplit)

同じ区切り文字を使用して頻繁に分割する場合は、前述のように正規表現を事前にコンパイルし、 RegexObject.split を使用します。

84
Kos

上記のJonathanの答えに応えて、これは特定の区切り文字に対してのみ機能するようです。例えば:

>>> a='Beautiful, is; better*than\nugly'
>>> import re
>>> re.split('; |, |\*|\n',a)
['Beautiful', 'is', 'better', 'than', 'ugly']

>>> b='1999-05-03 10:37:00'
>>> re.split('- :', b)
['1999-05-03 10:37:00']

区切り文字を角かっこで囲むことによって、より効果的に機能するようです。

>>> re.split('[- :]', b)
['1999', '05', '03', '10', '37', '00']
48
Paul

これが正規表現の外観です。

import re
# "semicolon or (a comma followed by a space)"
pattern = re.compile(r";|, ")

# "(semicolon or a comma) followed by a space"
pattern = re.compile(r"[;,] ")

print pattern.split(text)
25
Jochen Ritzel