4

ねえ、私は正規表現が大好きですが、私はそれらがまったく得意ではありません。

lol、omg、lmao...などの約400の短縮語のリストがあります。誰かがこれらの短縮された単語の1つを入力するときはいつでも、それはその英語の対応する単語に置き換えられます([笑い]、またはその趣旨の何か)。とにかく、人々は迷惑で、最後の文字をx回繰り返してこれらの速記語を入力します。

例:omg-> omgggg、lol-> lollll、haha-> ​​haha​​haha、lol-> lololol

誰かがこれに対処するために正規表現(できればPythonで)を私に渡してくれるかどうか疑問に思っていましたか?

皆さんありがとう。

(これは、興味があればトピックを特定するためのTwitter関連のプロジェクトです。誰かが「フープを撃ちに行こう」とツイートした場合、そのツイートがバスケットボールなどに関するものであることをどのように知っていますか)

4

2 に答える 2

7

最初のアプローチ -

さて、正規表現を使用すると、次のようにすることができます-

import re
re.sub('g+', 'g', 'omgggg')
re.sub('l+', 'l', 'lollll')

正規表現を使用することは、この問題に対処するための非常に脆弱で基本的なアプローチであることを指摘しておきます。上記の正規表現を破る文字列をユーザーから簡単に取得できます。私が言おうとしているのは、このアプローチでは、ユーザーが犯すミスのパターンを観察し、ケース固有の正規表現を作成するという点で、多くのメンテナンスが必要だということです。

2 番目のアプローチ -

代わりに、difflibモジュールの使用を検討しましたか? オブジェクト間のデルタを計算するためのヘルパーを備えたモジュールです。ここで特に重要なのは ですSequenceMatcher公式ドキュメントから言い換えると-

SequenceMatcher は、シーケンス要素がハッシュ可能である限り、任意のタイプのシーケンスのペアを比較するための柔軟なクラスです。SequenceMatcher は、2 つのシーケンス間の「人間にわかりやすい差分」を計算しようとします。基本的な概念は、最長の 連続したジャンクのない一致するサブシーケンスです。

import difflib as dl
x   = dl.SequenceMatcher(lambda x : x == ' ', "omg", "omgggg")
y   = dl.SequenceMatcher(lambda x : x == ' ', "omgggg","omg")
avg = (x.ratio()+y.ratio())/2.0
if avg>= 0.6: 
    print 'Match!'
else:
    print 'Sorry!'

ドキュメントによると、0.6 を超える ratio() はほぼ一致しています。データのニーズに合わせて比率を微調整する必要がある場合があります。より厳密なマッチングが必要な場合は、0.8 を超える値が適切であることがわかりました。

于 2010-10-09T06:10:18.437 に答える
4

どうですか

\b(?=lol)\S*(\S+)(?<=\blol)\1*\b

(などlolに置き換えます)omghaha

これは、 、 などに一致しますlolが、、などには失敗します。lololollolllllollollollololollllololly

ルール:

  1. 単語をlol完全に一致させます。
  2. 次に、単語の末尾にある 1 つまたは複数の文字の繰り返しを許可します (つまりlolまたはlol) 。

、、など\b(?=zomg)\S*(\S+)(?<=\bzomg)\1*\bと一致します。zomgzomgggzomgmgmgzomgomgomg

Python では、コメント付き:

result = re.sub(
    r"""(?ix)\b    # assert position at a word boundary
    (?=lol)        # assert that "lol" can be matched here
    \S*            # match any number of characters except whitespace
    (\S+)          # match at least one character (to be repeated later)
    (?<=\blol)     # until we have reached exactly the position after the 1st "lol"
    \1*            # then repeat the preceding character(s) any number of times
    \b             # and ensure that we end up at another word boundary""", 
    "lol", subject)

これは、「飾り気のない」バージョン (つまりlol、繰り返しなし) にも一致します。これを望まない場合は、\1+代わりに を使用してください\1*

于 2010-10-09T17:34:08.713 に答える