正規表現に基づくPython分割文字列


113

"HELLO there HOW are YOU"(Pythonで)大文字の単語のように文字列を分割する最良の方法は何ですか?

だから私はそのような配列になるでしょう: results = ['HELLO there', 'HOW are', 'YOU']


編集:

私が試してみました:

p = re.compile("\b[A-Z]{2,}\b")
print p.split(page_text)

ただし、動作しないようです。


2
何を試しましたか?-見つかりませんre.split()でしたか?
Gareth Latty、2012年

5
何かがうまくいかないと言うときは、その理由を説明する必要があります。例外はありますか?(もしそうなら、例外全体を投稿してください)あなたは間違った出力を得ますか?
Gareth Latty、2012年

回答:


134

私は提案します

l = re.compile("(?<!^)\s+(?=[A-Z])(?!.\s)").split(s)

このデモを確認してください。


5
コンパイルを使用しないとどうなりますか?
Feelsbadman

3
パー再ドキュメント、「ほとんどの正規表現操作がモジュールレベルの関数とRegexObject方法として利用できます。機能は、最初の正規表現オブジェクトをコンパイルする必要はなく、いくつかの微調整パラメータをお見逃しなくショートカットです。」あなたが使用することができますre.split(re.split(pattern, string, maxsplit=0, flags=0))以前に引用したドキュメントで述べたように。
ZaydH

57

あなたは先読みを使うことができます:

re.split(r'[ ](?=[A-Z]+\b)', input)

これは、単語の境界で終わる大文字の文字列が後に続くすべてのスペースで分割されます。

角かっこは読みやすくするためのものであり、省略することもできます。

単語の最初の文字が大文字で十分であれば(つまり、前で分割したい場合Hello)、さらに簡単になります。

re.split(r'[ ](?=[A-Z])', input)

これですべてのスペースで分割され、その後に大文字が続きます。


1
re.split(r'[ ](?=[A-Z]+\b)', input)大文字が見つからないようにするにはどうすればよいですか?たとえば、「A」と一致しませんか?試しましたre.split(r'[ ](?=[A-Z]{2,}+\b)', input)。ありがとう!

@JamesEggersつまり、次のような単語で分割しないように、少なくとも2つの大文字を必要とするということですIre.split(r'[ ](?=[A-Z]{2,}\b)', input)それを行う必要があります。
マーティンエンダー

2
私は少なくとも、[ ]+あるいは多分\W+少しだけ多くのケースをキャッチすることをお勧めします。それでも、良い答えです。
georg

私は同じアプローチを試みました。しかし、[ ]私にとってはうまくいきませんでした。代わりに、を使用しました\s。私のために働いた完全な正規表現はre.split("\s(?=[A-Z]+\s)", string)
h3xh4wk

0

あなたの質問は、文字列リテラルが含まれている"\b[A-Z]{2,}\b"が、それは\b何のR-修飾子が存在しないため、バックスペースを意味します。

試してください:r"\b[A-Z]{2,}\b"

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.