我正在尝试测试字符串只包含字母或数字。以下语句应返回false但不返回。我做错了什么?
bool(re.match('[A-Z\d]', '2ae12'))
答案 0 :(得分:2)
只需使用字符串方法isalnum()
,就可以完全按照自己的意愿使用。
答案 1 :(得分:1)
如果您希望返回True,如果字符串是全部数字或全部字母,您可以执行以下操作:
for case in ('abcdefg','12345','2ae12'):
print case, case.isalpha() or case.isdigit()
打印:
abcdefg True
12345 True
2ae12 False
如果你想要一个正则表达式的相同逻辑,你会这样做:
import re
for case in ('abcdefg','12345','2ae12'):
print case, bool(re.search(r'^(?:[a-zA-Z]+|\d+)$', case))
答案 2 :(得分:1)
虽然不是正则表达式,但您可以使用非常简洁的str.isalnum()
:
s = "sdfsdfq34sd"
print(s.isalnum())
输出:
True
但是,如果您确实需要纯正则表达式解决方案:
import re
if re.findall('^[a-zA-Z0-9]+$', s):
pass #string just contains letters and digits
使用数据帧解决方案,@Wen提供:
df.col1.apply(lambda x : x.isalnum())
df=pd.DataFrame( {'col1':["sdfsdfq34sd","sdfsdfq###34sd","sdfsdf!q34sd","sdfsdfq34s@d"]})
答案 3 :(得分:0)
您需要检查字符串是由字母还是数字组成的!
import re
bool(re.match('^[A-Za-z]+|\d+$', df['some_column'].str))
正如dawg建议你也可以使用isalpha
和isdigit
,
df['some_column'].str.isalpha() or df['some_column'].str.isdigit()
答案 4 :(得分:0)
你的正则表达式只匹配一个字符,我认为\d
被视为转义D而不是所有整数字符的集合。
如果你真的想在这里使用正则表达式,我会怎么做;
def isalphanum(test_str):
alphanum_re = re.compile(r"[0-9A-Z]+", re.I)
return bool(alphanum_re.match(test_str)
让我们关注alphanum regex。我用一个原始文字编译它,由字符串表示,旁边有一个'r'。当存在斜杠时,这种类型的字符串不会转义某些字符,这意味着r"\n"
被解释为斜线而N被解释为换行符。这在使用正则表达式时很有用,某些文本编辑器甚至会更改R字符串的语法突出显示以突出显示正则表达式中的功能以帮助您。 re.I标志忽略了测试字符串的大小写,因此[A-Z]将匹配大写或小写的A到Z.
更简单的Zen of Python解决方案涉及调用字符串的isalnum
方法;
test_str = "abc123"
test_str.isalnum()
答案 5 :(得分:0)
熊猫回答:考虑一下这个df
col
0 2ae12
1 2912
2 da2ae12
3 %2ae12
4 #^%6f
5 &^$*
您可以使用
选择仅包含字母或数字的行df[~df.col.str.contains('(\W+)')]
你得到了
col
0 2ae12
1 2912
2 da2ae12
如果您只想要一个布尔列,请使用
~df.col.str.contains('(\W+)')
0 True
1 True
2 True
3 False
4 False
5 False