0

正規表現スクリプトに少し問題があります。誰かが助けてくれることを願っています。

基本的に、Python スクリプトで re.findall() を使用する正規表現スクリプトがあります。私の目標は、さまざまな長さのさまざまな文字列を検索して、聖書の一節への参照を探すことです (たとえば、ヨハネ 3:16、ローマ人への手紙 6 など)。私の正規表現スクリプトはほとんど機能しますが、聖書の本の名前の前に余分な空白が追加されることがあります。スクリプトは次のとおりです。

versesToFind = re.findall(r'\d?\s?\w+\s\d+:?\d*', str)

この問題をよりよく説明するために、このテキスト文字列に対してこのスクリプトを実行したときの結果を次に示します。

str = 'testing testing John 3:16 adsfbaf John 2 1 Kings 4 Romans 4'

結果 (www.pythonregex.com から):

[u' John 3:16', u' John 2', u'1 Kings 4', u' Romans 4']

ご覧のとおり、John 2 と Romans 4 には、最初に削除したい余分な空白があります。うまくいけば、私の説明は理にかなっています。前もって感謝します!

4

3 に答える 3

1

括弧でグループ化することにより、数字とスペースを単一のユニットとしてオプションにすることができます(?:キャプチャしないことを指定するだけです)。

'(?:\d\s)?\w+\s\d+:?\d*'
 ^^^    ^

生成するのは、

>>> s = 'testing testing John 3:16 adsfbaf John 2 1 Kings 4 Romans 4'
>>> re.findall(r'(?:\d\s)?\w+\s\d+:?\d*', s)
['John 3:16', 'John 2', '1 Kings 4', 'Romans 4']
于 2013-08-11T02:35:27.587 に答える
0

リスト内包表記を使用すると、1 行で実行できます。

versesToFind = [x.strip() for x in re.findall(r'\d?\s?\w+\s\d+:?\d*', str)]
于 2013-08-11T02:38:20.357 に答える
0

正規表現を書き直す代わりに、いつでもstrip()空白だけを使用できます。

>>> L = [u' John 3:16', u' John 2', u'1 Kings 4', u' Romans 4']
>>> print map(unicode.strip, L)
[u'John 3:16', u'John 2', u'1 Kings 4', u'Romans 4']

map()ここは次とまったく同じです:

>>> print [i.strip() for i in L]
[u'John 3:16', u'John 2', u'1 Kings 4', u'Romans 4']
于 2013-08-11T02:30:30.207 に答える