回答編集履歴

1

コード修正

2019/05/13 05:35

投稿

can110
can110

スコア38266

test CHANGED
@@ -1,6 +1,12 @@
1
1
  KojiDoiさんの回答をもとにして文字列生成まで書きました。
2
2
 
3
3
  `itertools.product`を使うと比較的簡単に記述できます。
4
+
5
+ 追記を受けて
6
+
7
+ ---
8
+
9
+ かなり泥臭いですが、異なる文字種で区切る処理も書いてみました。
4
10
 
5
11
  ```Python
6
12
 
@@ -10,13 +16,61 @@
10
16
 
11
17
 
12
18
 
13
- a = 'アイウ1エオカ'
19
+ # 異なる文字種で区切る
14
20
 
15
- b = re.sub(r'((?<=\d)\D|(?<=\D)\d)', r' \1', a)
21
+ def split(s):
16
22
 
17
- lst = b.split(' ')
23
+ rk = re.compile(r'([ァ-ヴ]|ー)')
18
24
 
25
+ rd = re.compile(r'[0-9]')
26
+
27
+ ra = re.compile(r'[a-zA-Z]')
28
+
29
+
30
+
31
+ lst = []
32
+
33
+ prev,cur = -1,-1
34
+
35
+ sub = ''
36
+
37
+ for c in s:
38
+
39
+ if rk.match(c): cur = 1
40
+
41
+ elif rd.match(c): cur = 2
42
+
43
+ elif ra.match(c): cur = 3
44
+
45
+ else: cur = 4
46
+
47
+
48
+
49
+ if prev > 0 and prev != cur:
50
+
51
+ lst.append(sub)
52
+
53
+ sub = ''
54
+
55
+ sub += c
56
+
57
+ prev = cur
58
+
59
+
60
+
61
+ if sub:
62
+
63
+ lst.append(sub)
64
+
65
+
66
+
67
+ return lst
68
+
69
+
70
+
71
+ lst = split('アイウ1エオカABC')
72
+
19
- print(lst) # ['アイウ', '1', 'エオカ']
73
+ print(lst) # ['アイウ', '1', 'エオカ', 'ABC']
20
74
 
21
75
 
22
76
 
@@ -32,6 +86,8 @@
32
86
 
33
87
  ret.append(s)
34
88
 
89
+ print(ret)
90
+
35
- print(ret) # ['アイウ1エオカ', 'アイウ1_エオカ', 'アイウ_1エオカ', 'アイウ_1_エオカ']
91
+ # ['アイウ1エオカABC', 'アイウ1エオカ_ABC', 'アイウ1_エオカABC', 'アイウ1_エオカ_ABC', 'アイウ_1エオカABC', 'アイウ_1エオ カ_ABC', 'アイウ_1_エオカABC', 'アイウ_1_エオカ_ABC']
36
92
 
37
93
  ```