繰り返される (複数の) 句読点と記号に一致する正規表現が必要です。基本的に、...、???、!!!、###、@@@、+++ などの非英数字および非空白文字の繰り返し。繰り返されるのは同じ文字でなければならないため、 "!?@" のようなシーケンス。
[^\s\w]+ を試してみましたが、それは !!!、???、$$$ のすべてのケースをカバーしていますが、「!?@」にも一致するため、必要以上のものを得ることができます。 .
誰か教えてください。ありがとう。
私はあなたがこのようなものを探していると思います:
[run for run, leadchar in re.findall(r'(([^\w\s])\2+)', yourstring)]
例:
In : teststr = "4spaces then(*(@^#$&&&&(2((((99999****"
In : [run for run, leadchar in re.findall(r'(([^\w\s])\2+)',teststr)]
Out: ['&&&&', '((((', '****']
これにより、その文字列内の 4 つのスペースと「*(@^」などのシーケンスを除く、実行のリストが得られます。
それがまさにあなたが望むものではない場合は、例の文字列と正確に見たい出力を使用して質問を編集できます。
このパターンを試してください:
([.\?#@+,<>%~`!$^&\(\):;])\1+
\1
括弧の内容である最初に一致したグループを参照しています。
必要に応じて、句読点と記号のリストを拡張する必要があります。
編集: @Firoze Lafeer は、単一の正規表現ですべてを行う回答を投稿しました。誰かが正規表現とフィルタリング機能を組み合わせることに興味がある場合に備えて、これはそのままにしておきますが、この問題については、Firoze Lafeer の回答を使用する方が簡単で高速です。
Firoze Lafeer の回答を見る前に書かれた回答は、変更されていません。
単純な正規表現ではこれができません。古典的な簡潔な要約は、「正規表現は数えられない」です。ここでの議論:
Python ソリューションの場合、正規表現と少しの Python コードを組み合わせることをお勧めします。正規表現は、ある種の句読点が連続していないものをすべて破棄し、次に Python コードがチェックして、誤った一致 (句読点が連続しているがすべて同じ文字ではない一致) を破棄します。
import re
import string
# Character class to match punctuation. The dash ('-') is special
# in character classes, so put a backslash in front of it to make
# it just a literal dash.
_char_class_punct = "[" + re.escape(string.punctuation) + "]"
# Pattern: a punctuation character followed by one or more punctuation characters.
# Thus, a run of two or more punctuation characters.
_pat_punct_run = re.compile(_char_class_punct + _char_class_punct + '+')
def all_same(seq, basis_case=True):
itr = iter(seq)
try:
first = next(itr)
except StopIteration:
return basis_case
return all(x == first for x in itr)
def find_all_punct_runs(text):
return [s for s in _pat_punct_run.findall(text) if all_same(s, False)]
# alternate version of find_all_punct_runs() using re.finditer()
def find_all_punct_runs(text):
return (s for s in (m.group(0) for m in _pat_punct_run.finditer(text)) if all_same(s, False))
all_same()
文字列と同じようにイテレータでも機能するように、私が行った方法を書きました。Python ビルトインは空のシーケンスをall()
返しますが、これは のこの特定の使用に必要なものではないため、必要な基本ケースの引数を作成し、 の動作に一致するようにデフォルトにしました。True
all_same()
True
all()
これは、Python の内部 (正規表現エンジンまたは ) を使用して可能な限り多くの作業を行うall()
ため、非常に高速です。入力テキストが大きい場合は、 の代わりにfind_all_punct_runs()
使用するように書き直した方がよい場合があります。例を挙げました。この例では、リストではなくジェネレータ式も返されます。リストを作成するようにいつでも強制できます。re.finditer()
re.findall()
lst = list(find_all_punct_runs(text))
これは私がそれをする方法です:
>>> st='non-whitespace characters such as ..., ???, !!!, ###, @@@, +++ and'
>>> reg=r'(([.?#@+])\2{2,})'
>>> print [m.group(0) for m in re.finditer(reg,st)]
また
>>> print [g for g,l in re.findall(reg, st)]
どちらかが印刷します:
['...', '???', '###', '@@@', '+++']