9

Python で RE 式を使用して、テキストのチャンクをピリオドと感嘆符で分割しようとしています。ただし、分割すると、結果に「なし」が表示されます

a = "This is my text...I want it to split by periods. I also want it to split \
by exclamation marks! Is that so much to ask?"

これは私のコードです:

re.split('((?<=\w)\.(?!\..))|(!)',a)

楕円を避けたいので、これ (?<=\w).(?!..) があることに注意してください。それにもかかわらず、上記のコードは吐き出します:

['This is my text...I want it to split by periods', '.', None, ' \
I also want it to split by exclamation marks', None, '!', \
' Is that so much to ask?']

ご覧のとおり、ピリオドまたは感嘆符がある場所では、特別な「なし」がリストに追加されています。これはなぜですか、どうすればそれを取り除くことができますか?

4

3 に答える 3

14

次のことを試してください。

re.split(r'((?<=\w)\.(?!\..)|!)', a)

None2 つのキャプチャ グループがあり、すべてのグループが結果の一部として含まれているため、 が得られre.split()ます。

したがって.、2 番目のキャプチャ グループに一致するときはいつでも、最初のキャプチャ グループにNone一致するときはいつでもです。!None

結果は次のとおりです。

['This is my text...I want it to split by periods',
 '.',
 ' I also want it to split by exclamation marks',
 '!',
 ' Is that so much to ask?']

'.'結果にandを含めたくない場合は'!'、式全体を囲む括弧を削除してください。r'(?<=\w)\.(?!\..)|!'

于 2012-07-03T22:49:56.117 に答える
2

最初の部分だけでなく、|を避けるために全体または句を外側のキャプチャ グループで囲む、より単純な式 (ピリオドが前後にない、またはピリオドが先行しないもの) を次に示します。None

re.split(r'((?<!\.)\.(?!\.)|!)', a)

# Result:
# ['This is my text...I want it to split by periods', 
#  '.', 
#  ' I also want it to split by exclamation marks', 
#  '!', 
#  ' Is that so much to ask?']
于 2012-07-03T22:54:29.280 に答える
1

すべての感嘆符の後に、Noneここのように返されるスペース文字があるため、これが発生しています。

フィルタを使用して、これらを削除できますNone

>>> import re
>>> a = "This is my text...I want it to split by periods. I also want it to split \
by exclamation marks! Is that so much to ask?"

>>> filter(lambda x:x!=None, re.split('((?<=\w)\.(?!\..))|(!)',a))

['This is my text...I want it to split by periods', '.', ' I also want it to split by exclamation marks', '!', ' Is that so much to ask?']
于 2012-07-03T22:48:10.060 に答える