0

テキストドキュメントで価格を見つける必要があります。私のコードは次のようになります。

sentence = "This is test text $25,000 $25,000$20,000 $30"
pattern = re.compile(ur'[$€£]?\d+([.,]\d+)?', re.UNICODE | re.MULTILINE | re.DOTALL)
print pattern.findall(sentence)

望ましい結果は次のとおりです。

['$25,000', '$30']

これは私のタスクにとって有効な結果ではないため、結果に$ 25,000$20,000を含める必要はありません。完全な単語の一致のみが必要です。

しかし、私はこの結果を得る:

['$25,000', '$25,000', '$20,000', '$30']

空白または句読点で区切られた価格のみを含むように正規表現を書き直すにはどうすればよいですか?

4

2 に答える 2

1

これは私が得ることができる限り近いです(私が持っているよりも多くの正規表現スキルを持つ多くの人々がいますが):

pattern = re.compile(ur'(?:^|\s)[$€£]?\d+(?:[.,]\d+)?(?=\s|$)', re.UNICODE | re.MULTILINE | re.DOTALL)
print pattern.findall(sentence) # [' $25,000', ' $30']
于 2012-09-25T02:22:59.153 に答える
1

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

ur'(?<!\S)[€£$]?\d+(?:[.,]\d+)?(?!\S)'

否定的なアサーションを追加しました(?<!\S)(?!\S)これは、それぞれ「スペースがない場合は一致しない」と「スペースがない場合は一致しない」という意味です。

テスト済み:

>>> sentence = "$1234 $56$78.90 This is test text $25,000 $25,000$20,000 $30"
>>> pattern = re.compile(ur'(?<!\S)[€£$]?\d+(?:[.,]\d+)?(?!\S)', re.UNICODE | re.MULTILINE | re.DOTALL)
>>> print pattern.findall(sentence)
['$1234', '$25,000', '$30']

一致の前後に特定の非スペース文字を許可する場合は、許可する文字をどこに置き換え\Sます[^\s<chars>]<chars>。例:

ur'(?<![^\s:])[€£$]?\d+(?:[.,]\d+)?(?![^\s,.])'

パターンの前にa:を付け、その後に,または.:を付けることができます。

>>> sentence = "$1234 $56$78.90 This is test text:$25,000. $45. $25,000$20,000 $30"
>>> print pattern.findall(sentence)
['$1234', '$25,000', '$45', '$30']
于 2012-09-25T02:49:51.327 に答える