回答編集履歴

2

d

2019/06/07 12:33

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -45,3 +45,71 @@
45
45
  print(bool(re.search(r'[a-zA-Z0-9]', "あいう"))) # False
46
46
 
47
47
  ```
48
+
49
+
50
+
51
+ ## 追記
52
+
53
+
54
+
55
+ 「文字列に英数字が含まれてるのか」といった場合、「文字列にアルファベット**または**数字が少なくとも1文字以上含まれているかどうか」と通常解釈されます。
56
+
57
+ そうではなく、「文字列にアルファベット及び数字が両方含まれているかどうか」を判定したい場合は以下のやり方になります。
58
+
59
+
60
+
61
+
62
+
63
+ ```python
64
+
65
+ import re
66
+
67
+ import string
68
+
69
+
70
+
71
+ # 正規表現で調べる方法
72
+
73
+ def check_by_regex(s):
74
+
75
+ return bool(re.search(r"[a-zA-Z]", s)) and \
76
+
77
+ bool(re.search(r"[0-9]", s))
78
+
79
+
80
+
81
+
82
+
83
+ print(check_by_regex("あいう")) # False
84
+
85
+ print(check_by_regex("aaa")) # False
86
+
87
+ print(check_by_regex("aaa000")) # True
88
+
89
+ print(check_by_regex("000")) # False
90
+
91
+
92
+
93
+
94
+
95
+ # in で調べる方法
96
+
97
+ def check_by_in_operation(s):
98
+
99
+ return any(c in string.ascii_letters for c in s) and \
100
+
101
+ any(c in string.digits for c in s)
102
+
103
+
104
+
105
+
106
+
107
+ print(check_by_in_operation("あいう")) # False
108
+
109
+ print(check_by_in_operation("aaa")) # False
110
+
111
+ print(check_by_in_operation("aaa000")) # True
112
+
113
+ print(check_by_in_operation("000")) # False
114
+
115
+ ```

1

d

2019/06/07 12:32

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -13,3 +13,35 @@
13
13
  print(any(c.isalnum() for c in s)) # True
14
14
 
15
15
  ```
16
+
17
+
18
+
19
+ ## 追記
20
+
21
+
22
+
23
+ isalnum() だとひらがな等も True になってしまうので、正規表現で調べたほうが良さそうです。
24
+
25
+ 英数字は正規表現で `[a-zA-Z0-9]` なので、re.search() で文字列中に含まれるかどうか調べてください。
26
+
27
+ re.search() オブジェクトは見つかった場合は Match オブジェクト、見つからない場合は None を返すので、bool() をとると、前者は True、後者は False に変換できます。
28
+
29
+
30
+
31
+ ```python
32
+
33
+ import re
34
+
35
+
36
+
37
+ s = "あいう"
38
+
39
+ print(any(c.isalnum() for c in s)) # True
40
+
41
+
42
+
43
+ print(bool(re.search(r'[a-zA-Z0-9]', "aA00"))) # True
44
+
45
+ print(bool(re.search(r'[a-zA-Z0-9]', "あいう"))) # False
46
+
47
+ ```