

Pythonを使用して、ファイル名が規定通りかを確認するプログラムを作成しています。  
ファイル名が規定通りかを確認するにあたり正規表現を使用しています。  
"$"や"-"は、エスケープ文字(`\`)を付けることで正規表現のパターン指定ができました。  
シングルクォーテーションについては、どのように指定したらよいのでしょうか？

作成したプログラム

[code]

    import re
    strFileName = "Check'XXX.tar.gz"
    
    Reg = re.compile(r'^[a-zA-Z0-9\$-\.]+$')
    
    p = Reg.match(strFileName)
    if(p is None):
        print("False")
    else :
        print("True")
    
[/code]


CC BY-SA 4.0
2022-09-14T05:13:41.387
91097
2022-09-14T05:52:59.127
2022-09-14T05:26:07.040
3060
54246
question
python python3 正規表現
Python の正規表現で ' (シングルクォート) が含まれているかどうかを確認する方法


(正規表現として) `'` に特別な意味は無いはずなので、そのまま入力するだけだと思います。

パターンの指定時に `compile(r'...')` 内のシングルクォートと区別がつかない (うまく動かない)
のであれば、ダブルクォートに変えてみてください。

[code]

    compile(r"^[a-zA-Z0-9\$-\.']+$")
    
[/code]

余談として、`$` が特別な意味を持つのはパターンの行末に出てきた時のみです。`[ ]` 内ではエスケープ不要だと思います。


CC BY-SA 4.0
2022-09-14T05:32:17.300
91098
2022-09-14T05:32:17.300
3060
91097
answer


シングルクォーテーションを正規表現で扱う場合、エスケープは不要です。  
ただしpythonは文字列全体を`'シングルクォーテーション'`でくくっている時は`\'`のようにエスケープが必要です。

それは前提知識として、

> "$"や"-"は、エスケープ文字()を付けることで正規表現のパターン指定ができました。

ご質問のプログラムでは-がエスケープされていません。  
この場合、文字コード上で`$`と`.`の間にある`'`も正規表現の範囲に含まれてしまいますが、それが原因ではないでしょうか。

**サンプルコード**

[code]

    import re
    strFileName = "Check'XXX.tar.gz" 
    
    if re.match(r'^[a-zA-Z0-9\$-\.]+$', strFileName):
        print("$-.($から.まで)を指定してるので'シングルクォーテーション'も範囲内")
    
    if re.match(r'^[a-zA-Z0-9\$\-\.]+$', strFileName):
        print("$と-と.のみ指定してるので'シングルクォーテーション'は範囲外")
    
    if re.match(r"^[a-zA-Z0-9\$\-\.']+$", strFileName): # 文字列全体を"ダブルクォーテーション"でくくっている時は単純に'シングルクォーテーション'でOK
        print("$と-と.と'を指定してるので'シングルクォーテーション'は範囲内")
    
    if re.match(r'^[a-zA-Z0-9\$\-\.\']+$', strFileName): # 文字列全体を'シングルクォーテーション'でくくっている時は\'シングルクォーテーション\'でエスケープ
        print("$と-と.と'を指定してるので'シングルクォーテーション'は範囲内(ひとつ上の構文と同一の構文)")
    
[/code]

**実行結果**

[code]

    $-.($から.まで)を指定してるので'シングルクォーテーション'も範囲内
    $と-と.と'を指定してるので'シングルクォーテーション'は範囲内
    $と-と.と'を指定してるので'シングルクォーテーション'は範囲内(ひとつ上の構文と同一の構文)
    
[/code]


CC BY-SA 4.0
2022-09-14T05:52:59.127
91099
2022-09-14T05:52:59.127
9820
91097
answer