1

正規表現を可能な限り特定の単語に一致させる方法はありますか? たとえば、昨日、今日、明日という単語を探しているとします。

次の完全な単語を抽出したい:

  • はい
  • 昨日
  • トッド
  • 戸田
  • 今日
  • トム
  • 明日
  • 明日

    次の単語全体は一致しないはずです (基本的に、スペルミス)。

  • 昨日
  • 明日
  • 明日
  • トディ

    これまでに思いついた最高のものは次のとおりです。

    \b((tod(a(y)?)?)|(tom(o(r(r(o(w)?)?)?)?)?)|(yest(e(r(d(a(y)?)?)?)?)?))\b (例)

    注: 有限状態マシンを使用してこれを実装することはできましたが、正規表現でこれを行うのは面倒だと思いました。残念ながら、私が思いつくものはどれもばかばかしいほど複雑で、何かを見落としていることを願っています。

  • 4

    2 に答える 2

    1

    探している正規表現には、代替グループを含むオプションのグループが含まれている必要があります。

    \b(yest(?:e(?:r(?:d(?:ay?)?)?)?)?|tod(?:ay?)?|tom(?:o(?:r(?:r(?:ow?)?)?)?)?)\b
    

    デモを見る

    単語全体のみを照合する必要があるため、\b単語の境界は非常に重要であることに注意してください。

    正規表現の説明:

    • \b- 先頭の単語境界
    • (yest(?:e(?:r(?:d(?:ay?)?)?)?)?|tod(?:ay?)?|tom(?:o(?:r(?:r(?:o(?:w)?)?)?)?)?)- キャプチャ グループ マッチング
      • yest(?:e(?:r(?:d(?:ay?)?)?)?)?- yestyesteyesteryesterdyesterdaまたはyesterday
      • tod(?:ay?)?-todまたはtodaまたはtoday
      • tom(?:o(?:r(?:r(?:o(?:w)?)?)?)?)?- tomtomotomortomorrtomorroまたはtomorrow
    • \b- 末尾の単語境界

    Python デモを参照してください:

    import re
    p = re.compile(ur'\b(yest(?:e(?:r(?:d(?:ay?)?)?)?)?|tod(?:ay?)?|tom(?:o(?:r(?:r(?:ow?)?)?)?)?)\b', re.IGNORECASE)
    test_str = u"yest\nyeste\nyester\nyesterd\nyesterda\nyesterday\ntod\ntoda\ntoday\ntom\ntomo\ntomor\ntomorr\ntomorro\ntomorrow\n\nyesteray\ntomorow\ntommorrow\ntody\nyesteday"
    print(p.findall(test_str))
    # => [u'yest', u'yeste', u'yester', u'yesterd', u'yesterda', u'yesterday', u'tod', u'toda', u'today', u'tom', u'tomo', u'tomor', u'tomorr', u'tomorro', u'tomorrow']
    
    于 2015-12-31T09:49:07.743 に答える
    0

    以下のように、すべての有効な単語または単語の部分文字列をパイプで区切ります。これは、必要に応じて有効なスペルにのみ一致します

    ^(?|yest|yesterday|tod|today)\b
    

    これはすでにhttps://regex101.com/でテスト済み

    于 2015-12-31T05:04:11.620 に答える