

タイトルの通り、  
文字、数字が混ざる文章から文字は１文字ずつ、数字は次に文字が出るまでをひとまとまりとして処理したいです。  
コードはpythonです。

例えば、

[code]

    def printer(letter):
        # 本来は何らかの処理
        print(letter)
    
    sentence = "きょうは19あしたは20"
    for letter in sentence:
        if not letter.isdecimal():
            printer(letter)
        else:
            printer(letter)
    
[/code]

だと、

[code]

    き
    ょ
    う
    は
    1
    9
    あ
    し
    た
    は
    2
    0
    
[/code]

となりますが、

[code]

    き
    ょ
    う
    は
    19
    あ
    し
    た
    は
    20
    
[/code]

と処理されるような方法を知りたいです。


CC BY-SA 4.0
2018-09-18T22:31:15.160
48520
2018-09-19T04:18:51.187
30159
question
python
pythonで文字と数字が混ざる文章から、文字は１文字ずつ、数字はまとまりで頭から順番に処理する方法


例えば正規表現を使うとこんな感じでできます。(python3です。)

[code]

    import re
    
    def printer(letter):
        # 本来は何らかの処理
        print(letter)
    
    sentence = "きょうは19あしたは20"
    
    for match in re.findall('[0-9]+|[^0-9]', sentence):
        printer(match)
    
[/code]

結果:

>
[code]

>     き
>     ょ
>     う
>     は
>     19
>     あ
>     し
>     た
>     は
>     20
>  
[/code]


CC BY-SA 4.0
2018-09-18T23:54:46.723
48521
2018-09-18T23:54:46.723
13972
48520
answer


`re.split()` を使ってみました。

[code]

    import re
    
    def printer(letter):
      # 本来は何らかの処理
      print(letter)
    
    sentence = "きょうは19あしたは20"
    ##sentence = "きょうは１９あしたは２０"
    [printer(c) for c in re.split('(\d+|\D)', sentence) if c not in [None, '']]
    
[/code]

ちなみに、正規表現として `\d` を使っていますけれども、(ご存知かもしれませんが) python3 では `U+FF10` 〜
`U+FF19`(俗に言う「全角」文字)にもマッチします(`re.split()` の引数に `flags = re.ASCII`
を追加すればマッチしなくなります)。


CC BY-SA 4.0
2018-09-19T04:18:51.187
48530
2018-09-19T04:18:51.187
48520
answer