6

単語の先頭と末尾から文字以外の文字をすべて削除する必要がありますが、2 文字の間にある場合はそのままにしておきます。

例えば:

'123foo456' --> 'foo'
'2foo1c#BAR' --> 'foo1c#BAR'

を使ってみre.sub()ましたが、正規表現が書けませんでした。

4

6 に答える 6

7

このような?

re.sub('^[^a-zA-Z]*|[^a-zA-Z]*$','',s)

s入力文字列です。

于 2012-10-12T16:24:02.610 に答える
6

これには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'
于 2012-10-12T16:25:16.290 に答える
2

あなたの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

于 2012-10-12T16:25:20.040 に答える
2

Unicode と互換性を持たせるには:

^\PL+|\PL+$

\PLの略not a letter

于 2012-10-12T17:42:23.293 に答える
0

これを試して:

re.sub(r'^[^a-zA-Z]*(.*?)[^a-zA-Z]*$', '\1', string);

丸括弧は、文字列の最初と最後にある文字以外の文字列の間のすべてをキャプチャします。は、 が最後に文字以外の文字列もキャプチャしないようにします?.置換は、キャプチャされたグループを単に出力します。

于 2012-10-12T16:24:17.987 に答える
0

result = re.sub('(.*?)([a-z].*[a-z])(.*)', '\\2', '23WERT#3T67', flags=re.IGNORECASE)

于 2012-10-12T16:25:26.917 に答える