38413


**対象**

[code]

    12a345a67.8
    90a123a45
    67.8a901a23.4
    
[/code]

* * *

**前提条件**  
・aの個数は「0」か「2」  
・aが「0」の場合は何も処理しない

* * *

**やりたいこと**  
・上記のような文字列がある時、`「最初のaまで」と「それ以降」`、もしくは、`「最初のaまで」「2番目のaまで」「それ以降」`をそれぞれ分離してキャプチャ取得したい

**12a345a67.8の場合**  
・下記何れかの分離方式でキャプチャ取得したい  
・`「12」「345a67.8」`  
・`「12a」「345a67.8」`  
・`「12」「345」「67.8」`  
・`「12a」「345a」「67.8」`

* * *

**試したこと**  
・最初のaまでキャプチャ取得

[code]

    ^(.*?)a
    
[/code]


CC BY-SA 3.0
2017-10-04T06:04:20.223
38411
2017-10-04T07:02:00.653
2017-10-04T06:44:26.620
7886
7886
question
正規表現
「12a345a67.8」から正規表現で、「12」と「345a67.8」をキャプチャ取得したい


`^(.*?)a(.*)$`

とすれば、`\1`で最初のaまでが、`\2`最初のa以降が取得できると思います。  
実装するなら、再帰的に実行すれば2番目以降のaについてもa以前、a以降が取得できると思います。

1つの正規表現でも、複数のaに対してmatchさせることは可能だと思うんですが...正規表現の処理系に依存すると思うので、とりあえずここまでで。


CC BY-SA 3.0
2017-10-04T06:23:44.313
38412
2017-10-04T06:32:39.203
2017-10-04T06:32:39.203
2383
2383
38411
answer


言語依存の低い記述としては

[code]

    ^([^a]+a)([^a]+a)?(.+)$
    
[/code]

でしょうか。２番目の`a`までの部分について`?`とすることでマッチする場合は取り込み、しない場合は通過し「それ以降」に回すことができます。

この辺り、質問文が曖昧なので何を求めているのかうまく読み取れません。`a`が確実に２つ以上存在するのか１つの場合にも対処したいとしているのか、それとも技術的にハードルが高いと感じ２つ目以降の`a`を気にしなくてもよいと言っているのか、とか。`a`が３個以上存在する場合にはどうふるまってほしいのか、とか。

* * *

追記

>   * aの個数は「0」か「2」
>   * aが「0」の場合は何も処理しない
>

とのことですので、

[code]

    ^([^a]+)a(.+)$          // 「12」「345a67.8」
    ^([^a]+a)(.+)$          // 「12a」「345a67.8」
    ^([^a]+)a([^a]+)a(.+)$  // 「12」「345」「67.8」
    ^([^a]+a)([^a]+a)(.+)$  // 「12a」「345a」「67.8」
    
[/code]

で十分でした。実は「何も処理しない」という前提条件もあいまいで、マッチに失敗してほしいのか、それとも全体を「最初のaまで」もしくは「それ以降」として扱ってほしいのか、解釈が分かれます。上記回答は「マッチしない」動作となります。


CC BY-SA 3.0
2017-10-04T06:31:44.327
38413
2017-10-04T07:02:00.653
2017-10-04T07:02:00.653
4236
4236
38411
answer


Pythonで実装してみました。

  * 入力: 12a345a67.8
  * 出力: 12, 345, 67.8

<https://ideone.com/WKF37V>

[code]

    import re
    
    SRCSTR = "12a345a67.8"
    PATN = r"[^\sa,]+"
    res = re.findall(PATN, SRCSTR)
    
    for elem in res:
        print(elem)
    
[/code]

結果

[code]

    12
    345
    67.8
    
[/code]

また、  
<https://www.debuggex.com/#cheatsheet>  
にて  
\- 言語Pythonの下のボックスに「[^\sa,]+」を  
\- その下(Result)に「12a345a67.8」を  
入力して確認しました。  
( <https://www.debuggex.com/r/bjIEfhzPYHXraF_P> )

12a345a67.8a9012  
なども対応可能です。

参考: <https://stackoverflow.com/questions/18808707/python-find-substrings-
based-on-a-delimiter>


CC BY-SA 3.0
2017-10-04T06:35:55.280
38414
2017-10-04T06:35:55.280
4840
38411
answer