定番の正規表現に関する面接の質問
I. 基本概念の復習
具体的な質問に入る前に、面接官はまず、正規表現の基本的な概念の理解度を確認することがよくあります。
正規表現とは何ですか?
正規表現とは、テキストパターンを記述する文字列のことです。メタ文字と呼ばれる特殊文字を使って、テキスト内の特定のコンテンツを照合、検索、置換するために使用できます。
一般的なメタ文字とその意味は何ですか?
.(ドット): 改行を除く任意の 1 文字に一致します。*(アスタリスク): 直前の文字の 0 回以上の繰り返しに一致します。+(プラス): 直前の文字の 1 回以上の繰り返しに一致します。?(クエスチョンマーク): 直前の文字の 0 回または 1 回の繰り返しに一致します。[](角括弧): 文字セットを定義し、内部のいずれかの 1 文字に一致します。[^](否定角括弧): 否定された文字セットを定義し、内部にないいずれかの 1 文字に一致します。^(キャレット): 文字列の先頭に一致します。$(ドル記号): 文字列の末尾に一致します。\d: 任意の数字 (0-9) に一致します。\w: 任意の英数字 (a-z, A-Z, 0-9, _) に一致します。\s: 任意の空白文字 (スペース、タブ、改行など) に一致します。()(丸括弧): 一致したコンテンツをグループ化およびキャプチャするために使用されます。|(パイプ): 代替を表し、左または右のパターンのいずれかに一致します。\(バックスラッシュ): 特殊文字をエスケープし、その特殊な意味を削除します。
貪欲マッチングと非貪欲マッチングとは何ですか?非貪欲マッチングを達成するには?
- 貪欲マッチング: デフォルトでは、正規表現エンジンは可能な限り多くの文字に一致します。
- 非貪欲マッチング: 正規表現エンジンは可能な限り少ない文字に一致します。
- 非貪欲マッチングの達成: 量指定子 (
*,+,?,{m,n}) の後に?を追加します。たとえば、.*は貪欲ですが、.*?は非貪欲です。
II. 定番の面接の質問と解決策
以下は、詳細な説明と Python コード例を含む、一般的な正規表現に関する面接の質問です。
1. メールアドレスの検証
質問: メールアドレスの形式が正しいかどうかを確認する正規表現を記述してください。
アプローチ: 通常、単純なメール形式には、ユーザー名、@ 記号、およびドメインが含まれます。
正規表現:
import re
def validate_email(email):
pattern = r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"
return bool(re.match(pattern, email))
# Tests
print(validate_email("[email protected]")) # True
print(validate_email("[email protected]")) # True
print(validate_email("invalid-email")) # False
print(validate_email("test@example")) # False
説明:^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ は、基本的なメール形式に一致します。
注: これは単純なメール検証の正規表現です。より厳密な検証では、ドメインの長さや特殊文字など、より多くのケースを考慮する必要があります。
2. HTML タグからコンテンツを抽出する
質問: HTML タグからコンテンツを抽出する正規表現を記述します。たとえば、 This is a paragraph. から "This is a paragraph." を抽出します。
アプローチ: グループ化 () を使用して、タグ内のコンテンツをキャプチャします。
正規表現:
import re
def extract_content(html):
pattern = r"<[^>]+>(.*?)[^>]+>"
match = re.search(pattern, html)
if match:
return match.group(1) # Return first captured group
else:
return None
# Tests
html = "This is a paragraph.
"
print(extract_content(html)) # This is a paragraph.
html = "This is a heading
"
print(extract_content(html)) # This is a heading
html = "Some text"
print(extract_content(html)) # Some text
説明:<[^>]+>(.*?)[^>]+> は HTML タグに一致し、非貪欲マッチングを使用してコンテンツを抽出します。
注: この正規表現は、単純な HTML タグからのみコンテンツを抽出します。ネストされたタグの場合、より複雑な正規表現または HTML パーサーが必要です。
3. IP アドレスのマッチング
質問: IP アドレスの形式が正しいかどうかを検証する正規表現を記述します。
アプローチ: IP アドレスは、0〜255 の範囲の 4 つの数字で構成され、ドットで区切られています。
正規表現:
import re
def validate_ip(ip):
pattern = r"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"
return bool(re.match(pattern, ip))
# Tests
print(validate_ip("192.168.1.1")) # True
print(validate_ip("10.0.0.255")) # True
print(validate_ip("256.0.0.1")) # False
print(validate_ip("192.168.1.256")) # False
print(validate_ip("192.168.1")) # False
説明:^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ は IP アドレス形式に一致し、各数値の範囲を検証します。
4. 文字列内の機密ワードの置換
質問: 正規表現を使用して、文字列内の機密ワードを * に置き換える関数を記述します。
アプローチ: 置換には re.sub() 関数を使用します。
コード:
import re
def censor_words(text, sensitive_words):
pattern = "|".join(re.escape(word) for word in sensitive_words)
return re.sub(pattern, "*", text)
# Tests
text = "This is a bad word and another bad word."
sensitive_words = ["bad", "another"]
print(censor_words(text, sensitive_words)) # This is a * word and * * word.
text = "This is a test with special characters like . and *."
sensitive_words = [".", "*"]
print(censor_words(text, sensitive_words)) # This is a test with special characters like * and *.
説明:re.sub() を使用して、一致した機密ワードを * に置き換えます。
5. URL からドメインを抽出する
質問: URL からドメイン名を抽出する正規表現を記述します。
アプローチ: URL 形式は通常 protocol://domain/path です。domain 部分を抽出する必要があります。
正規表現:
import re
def extract_domain(url):
pattern = r"^(?:https?:\/\/)?(?:www\.)?([a-zA-Z0-9.-]+)\.([a-zA-Z]{2,6})(?:\/.*)?$"
match = re.match(pattern, url)
if match:
return match.group(1) + "." + match.group(2)
else:
return None
# Tests
print(extract_domain("http://www.example.com/path")) # example.com
print(extract_domain("https://example.co.uk")) # example.co.uk
print(extract_domain("example.com")) # example.com
print(extract_domain("sub.example.com/path")) # sub.example.com
説明:^(?:https?:\/\/)?(?:www\.)?([a-zA-Z0-9.-]+)\.([a-zA-Z]{2,6})(?:\/.*)?$ は URL 形式に一致し、ドメインを抽出します。
III. まとめとヒント
正規表現をマスターするには、継続的な練習が必要です。面接の前に、以下をお勧めします。
- 基本的な正規表現の概念とメタ文字を復習します。
- より多くの演習を練習して、一般的な正規表現パターンに慣れてください。
- 貪欲マッチングと非貪欲マッチングの違いを理解してください。
- プログラミング言語の正規表現 API に慣れてください。
- 面接中は、思考プロセスと正規表現パターンを明確に説明してください。
この記事が、正規表現の面接の準備に役立つことを願っています。頑張ってください!