2

ピリオドの間の文字列の一部を抽出する正規表現に苦労していますが、特定の文字が前にある場合はピリオドを無視します (例では CO.)。関連するチャンクは常に「LTD」で終わると想定できます。

ケース 1:

string = "FREDS CHIP SHOP.  S & B SERVICES CO. & SONS LTD. 1-12 THE STREET"

私が欲しい:"S & B SERVICES CO. & SONS LTD."

ケース 2:

string = "SOME TEXT.  BUSINESS NAME LTD. 1-12 THE STREET"

私が欲しい"BUSINESS NAME LTD."

ケース 3:

string = "SIMPLE BUSINESS NAME LTD. 1-12 THE STREET"

私が欲しい"SIMPLE BUSINESS NAME LTD."

私は現在持っています:

#!/usr/bin/python
import sys
import re

vnumber_name = "FREDS CHIP SHOP.  S & B SERVICES CO. & SONS LTD. 1-12 THE STREET"
#vnumber_name = "SOME TEXT.  BUSINESS NAME LTD. 1-12 THE STREET"
#vnumber_name = "SIMPLE BUSINESS NAME LTD. 1-12 THE STREET"

def test(vnumber_name):
    #ltd = re.search(r'.+\sLTD[.]?', vnumber_name)
    ltd = re.search(r'[.?][\s]{1,2}(?:[^.]+|(?!CO.))LTD[.]?', vnumber_name)
    if ltd:
        print "got it: " + ltd.group(0)
    else:
        print "nothing"

test(vnumber_name)

これは正しくありません。

if 句をいくつか作成することもできますが、1 行の正規表現でそれを取得できればすばらしいでしょう。

4

1 に答える 1

0

おそらく複数の略語を除外したいので、「否定後読み」を使用してより柔軟なものを次に示します。文字列の先頭から、特定の文字列に続かない次のピリオドまで一致します (COまたはCORPこの例の場合)。非貪欲(その後にピリオドが続く) は、最初の.*?そのようなピリオドまで一致させます。

.*?(?<!..CO|CORP)\.

これにより、文字列を「文」に適切に分割できます。LTD で終わるものだけに興味がある場合は、それらを選択できます。

于 2012-12-06T11:40:21.943 に答える