質問するログイン新規登録

回答編集履歴

1

コード修正

2019/05/13 05:35

投稿

8524ba23
8524ba23

スコア38350

answer CHANGED
@@ -1,19 +1,47 @@
1
1
  KojiDoiさんの回答をもとにして文字列生成まで書きました。
2
2
  `itertools.product`を使うと比較的簡単に記述できます。
3
+ 追記を受けて
4
+ ---
5
+ かなり泥臭いですが、異なる文字種で区切る処理も書いてみました。
3
6
  ```Python
4
7
  import re
5
8
  import itertools
6
9
 
10
+ # 異なる文字種で区切る
11
+ def split(s):
7
- a = 'アイウ1エオカ'
12
+ rk = re.compile(r'([ァ-ヴ]|ー)')
8
- b = re.sub(r'((?<=\d)\D|(?<=\D)\d)', r' \1', a)
9
- lst = b.split(' ')
13
+ rd = re.compile(r'[0-9]')
10
- print(lst) # ['アイウ', '1', 'エオカ']
14
+ ra = re.compile(r'[a-zA-Z]')
11
15
 
16
+ lst = []
17
+ prev,cur = -1,-1
18
+ sub = ''
19
+ for c in s:
20
+ if rk.match(c): cur = 1
21
+ elif rd.match(c): cur = 2
22
+ elif ra.match(c): cur = 3
23
+ else: cur = 4
24
+
25
+ if prev > 0 and prev != cur:
26
+ lst.append(sub)
27
+ sub = ''
28
+ sub += c
29
+ prev = cur
30
+
31
+ if sub:
32
+ lst.append(sub)
33
+
34
+ return lst
35
+
36
+ lst = split('アイウ1エオカABC')
37
+ print(lst) # ['アイウ', '1', 'エオカ', 'ABC']
38
+
12
39
  ret = []
13
40
  for tpl in itertools.product(['','_'],repeat=len(lst)-1):
14
41
  s = lst[0]
15
42
  for t,l in zip(tpl,lst[1:]):
16
43
  s += t + l
17
44
  ret.append(s)
45
+ print(ret)
18
- print(ret) # ['アイウ1エオカ', 'アイウ1_エオカ', 'アイウ_1エオカ', 'アイウ_1_エオカ']
46
+ # ['アイウ1エオカABC', 'アイウ1エオカ_ABC', 'アイウ1_エオカABC', 'アイウ1_エオカ_ABC', 'アイウ_1エオカABC', 'アイウ_1エオ カ_ABC', 'アイウ_1_エオカABC', 'アイウ_1_エオカ_ABC']
19
47
  ```