単語の先頭と末尾から文字以外の文字をすべて削除する必要がありますが、2 文字の間にある場合はそのままにしておきます。
例えば:
'123foo456' --> 'foo'
'2foo1c#BAR' --> 'foo1c#BAR'
を使ってみre.sub()
ましたが、正規表現が書けませんでした。
このような?
re.sub('^[^a-zA-Z]*|[^a-zA-Z]*$','',s)
s
入力文字列です。
これにはstr.stripを使用できます。
In [1]: import string
In [4]: '123foo456'.strip(string.digits)
Out[4]: 'foo'
In [5]: '2foo1c#BAR'.strip(string.digits)
Out[5]: 'foo1c#BAR'
マットがコメントで指摘しているように (ありがとう、マット)、これは数字のみを削除します。文字以外の文字を削除するには、
非文字の意味を定義します。
In [22]: allchars = string.maketrans('', '')
In [23]: nonletter = allchars.translate(allchars, string.letters)
そしてストリップします:
In [18]: '2foo1c#BAR'.strip(nonletter)
Out[18]: 'foo1c#BAR'
あなたの2つの例で、ここで説明されているように、Pythonの貪欲でない構文を使用して正規表現を作成できました。入力を 3 つの部分に分割しました。非文字、文字のみ、最後まで非文字です。テスト実行は次のとおりです。
1:[123] 2:[foo] 3:[456]
1:[2] 2:[foo1c#BAR] 3:[]
正規表現は次のとおりです。
^([^A-Za-z]*)(.*?)([^A-Za-z]*)$
そして、MatchObject はmo.group(2)
どこにあるのでしょうか。mo
Unicode と互換性を持たせるには:
^\PL+|\PL+$
\PL
の略not a letter
これを試して:
re.sub(r'^[^a-zA-Z]*(.*?)[^a-zA-Z]*$', '\1', string);
丸括弧は、文字列の最初と最後にある文字以外の文字列の間のすべてをキャプチャします。は、 が最後に文字以外の文字列もキャプチャしないようにします?
。.
置換は、キャプチャされたグループを単に出力します。
result = re.sub('(.*?)([a-z].*[a-z])(.*)', '\\2', '23WERT#3T67', flags=re.IGNORECASE)