

お世話になります。  
数字のあとのコンマのあとにスペースを入れたいと考えています。  
そこで、下記のような正規表現を指定しました。

[code]

    パターン文字列：
    (\d+),
    検索語の文字列：
    \1, 
    
[/code]

しかし、上記のような正規表現の場合、「1,2,3,4,5」のような文字列は問題ありませんが、「1,234」のように位取り点が含まれる文字列では「1,
234」のようになってしまい、少し不都合です。  
なにかよい書き方はないでしょうか。  
なお、言語はPythonを利用していますが、特にこだわっているわけではないため、これ以外でも結構です。  
わかりにくい質問となってしまい恐縮ですが、アドバイスいただけますと幸いです。  
よろしくお願いいたします。


CC BY-SA 4.0
2020-05-12T08:17:49.957
66536
2023-06-17T15:00:25.040
29034
question
正規表現
正規表現で数字のあとのコンマのあとにスペースを入れる方法


そもそも「位取り用のコンマ」と「区切り用のコンマ」はどのように区別をつける要件でしょうか？  
何か条件があるのであれば、その条件を実装すればよいかと思います。


CC BY-SA 4.0
2020-05-12T13:23:40.440
66544
2020-05-12T13:23:40.440
40046
66536
answer


「位取り用のコンマ」と「区切り用のコンマ」の判別を目視で行うしかないならば、正規表現置換が可能なテキストエディタで個別に置換するのが手っ取り早いと思います。

位取り用のコンマがほとんどないテキストであれば、下記のサンプルコードのように全置換をしつつ怪しい箇所をリストアップして告知する運用方法も考えられます。

**サンプルコード**

[code]

    import re
    
    src = """ 
    1,2,3,4,5
    12,345 位取り
    ,123,456,789
    1,23,456 1個目の,は区切り。2個目の,は位取りかもしれない
    これも123,4567 位取りではない
    1.234 567,890 小数点以下はスペース区切り
    """ 
    pattern = re.compile(r",(\d+)")
    
    # 置換
    result = pattern.subn(r", \1", src)
    print(result[0])
    print(f"{result[1]}か所置換しました。")
    
    # 位取りカンマ候補の簡易チェック
    if(result[1] > 0):
        print("位取りカンマ候補の位置と、**該当テキスト**を表示します。")
    for i, l in enumerate(src.splitlines()):
        for m in pattern.finditer(l):
            if len(m.group(1)) == 3:
                print("{}行{}文字目は位取りカンマかも: {}**{}**{}".format(i+1, m.start()+1, l[:m.start()], l[m.start():m.end()], l[m.end():]))
    
[/code]

**実行結果**

[code]

    1, 2, 3, 4, 5
    12, 345 位取り
    , 123, 456, 789
    1, 23, 456 1個目の,は区切り。2個目の,は位取りかもしれない
    これも123, 4567 位取りではない
    1.234 567, 890 小数点以下はスペース区切り
    
    12か所置換しました。
    3行3文字目は位取りカンマかも: 12**,345** 位取り
    4行1文字目は位取りカンマかも: **,123**,456,789
    4行5文字目は位取りカンマかも: ,123**,456**,789
    4行9文字目は位取りカンマかも: ,123,456**,789**
    5行5文字目は位取りカンマかも: 1,23**,456** 1個目の,は区切り。2個目の,は位取りかもしれない
    7行10文字目は位取りカンマかも: 1.234 567**,890** 小数点以下はスペース区切り
    
[/code]


CC BY-SA 4.0
2022-09-13T03:07:19.533
91071
2022-09-13T03:07:19.533
9820
66536
answer


「肯定先読み」と「数字以外」を組み合わせてはどうですか？

[code]

    (\d+)+,(?=\D)
    
[/code]


CC BY-SA 4.0
2023-03-15T22:36:29.467
94197
2023-03-16T01:24:07.363
2023-03-16T01:24:07.363
3060
37016
66536
answer