前書き
Leetcodeのブラッシングの質問
で、次の問題が発生しました。「、」「:」などの文字を含む文字列では、文字と数字のみが考慮されるため、もちろん文字と数字のみを保持し、その他は削除します。
1. re.sub()関数を使用します
正則化の知識については、このWebサイトを参照してください
。Pythonのreモジュールは、文字列内の一致を置き換えるためのre.sub構文を提供します
。
re.sub(pattern, repl, string, count=0, flags=0)
パラメータ:
pattern:通常のパターン文字列。
repl:置換された文字列。関数にすることもできます。
string:検索および置換される元の文字列。
count:パターンが一致した後の置換の最大数。デフォルトの0は、すべての一致を置換することを意味します。
フラグ:コンパイル中に使用されるマッチングモード(デジタル形式)。
最初の3つは必須パラメーターであり、最後の2つはオプションのパラメーターです。
import re
s = "A man, a plan, a canal: Panama"
s = s.lower()
result = re.sub('[\W_]+', '', s)
print(result)
# amanaplanacanalpanama
すごいじゃないですか?
正規表現パターン構文の特別な要素を利用します。
[…]は、個別にリストされた文字のグループを表すために使用されます。[amk]は「a」、「m」、または「k」に一致します
[^…] []にない文字:[^ abc]は、a、b、を除いて一致しますc以外の文字。
re *は0個以上の式に一致します。
re +は1つ以上の式に一致します。
re?前の正規表現で定義された0または1のフラグメントに一致し、貪欲でない方法
\ wは英数字のアンダースコアに一致します
\ Wは非数値の文字のアンダースコアに一致します
したがって、[\ W _] +は1つ以上の数字以外の文字に一致することを意味します。
[\ W _] +を[\ w _] +に変更すると、1つ以上の数字に一致することを意味します
import re
s = "A man, a plan, a canal: Panama"
s = s.lower()
result = re.sub('[\w_]+', '', s)
print(result)
# , , :
2.isalpha()+ isnumeric()+ join()
このメソッドは、文字列内の各要素を反復処理し、joinメソッドを組み合わせることにより、文字列の組み込みメソッドisalpha()およびisnumeric()を利用します(join()メソッドは、シーケンス内の要素を新しい文字列を生成するために指定された文字)。
s = "A man, a plan, a canal: Panama"
s = s.lower()
# 去掉除字符串与数字外的其他
s = [i for i in s if i.isalpha() or i.isnumeric()]
s = "".join(s)
print(s)
# amanaplanacanalpanama
文字と数字のみを削除することもできます
s = "A man, a plan, a canal: Panama"
s = s.lower()
# 去掉除字符串与数字外的其他
s = [i for i in s if not i.isalpha() and not i.isnumeric()]
s = "".join(s)
print(s)
# , , :