0

一致するパターンが特定の文字列を除外する正規表現を作成しようとしています。数字のみと英数字の文字列をすべて削除し、句読点もすべて削除しますが、特定の意味のある文字列 (911、K-12、K9、E-COMMERCE など) は保持します。

否定的な先読みを使用して、スキップする必要があるものを指定する必要があると考えました。マッチング パターンはほぼ必要に応じて機能しますが、機能しないパターンがいくつかあります。以下は、コードとマッチングの結果です。結果がどうあるべきかを指定したものがいくつかあります。私が理解できないのは、句読点、数字、および文字を組み合わせた文字列です。どんな助けでも大歓迎です。ありがとう。

blah <- c('ASDF911 2346', 'E-COMMERCE', 'AMAZON E-COMMERCE', 'K-12 89752 911', '65426 -', 'TEACHERK-12', 'K9 OFFICER', 'WORK - K-9564', 'DEVELOPER C++', ' C+ C +5', 'DEFAULT - 456')
gsub('(^| )(?!(911|E[-]COMMERCE|K[-]12|C[+]{1,2}))([[:punct:]]|[0-9]+|([0-9]+[A-Z]+|[A-Z]+[0-9]+)[0-9A-Z]*)', ' ', blah, perl = TRUE)

" "                     # OK
"E-COMMERCE"            # OK
"AMAZON E-COMMERCE"     # OK
"K-12  911"             # OK
"  "                    # OK
"TEACHERK-12"           # this should be "  "
"K9 OFFICER"            # OK
"WORK K-9564"           # this should be "WORK   "
"DEVELOPER C++"         # OK
" C+ C 5"               # this should be " C+ C "
"DEFAULT  "             # OK
4

1 に答える 1

1

両方を一致させてから、ホワイトリストに登録されたキーワードに置き換える方が簡単です。

gsub('(?:\\b(911\\b|E-COMMERCE\\b|K-12\\b|C\\b[+]{0,2})|[[:punct:]]|[A-Z-]*[0-9][A-Z0-9-]*)', '\\1', blah, perl = TRUE)

出力:

" "
"E-COMMERCE"
"AMAZON E-COMMERCE"
"K-12  911"
" "
""
" OFFICER"   # Should this really be "K9 OFFICER"?
"WORK  "
"DEVELOPER C++"
" C+ C "
"DEFAULT  "
  • \b単語境界です。これは、一連の単語文字 ( ) の端にある空の文字列に一致します[A-Za-z0-9_]。の最適化版です(?<!\w)(?=\w)|(?<=\w)(?!\w)
  • [A-Z-]*[0-9][A-Z0-9-]*少なくとも 1 つの数字を含む、文字、数字、およびダッシュの文字列に一致します。

http://ideone.com/E3TUU5

于 2013-11-06T16:13:15.563 に答える