python判断字符串里的字符_在Python中,如何检查字符串是否只包含某些字符?

John Machin..

35

最终(?)编辑

使用带注释的交互式会话回答,包含在函数中:

>>> import re

>>> def special_match(strg, search=re.compile(r'[^a-z0-9.]').search):

... return not bool(search(strg))

...

>>> special_match("")

True

>>> special_match("az09.")

True

>>> special_match("az09.\n")

False

# The above test case is to catch out any attempt to use re.match()

# with a `$` instead of `\Z` -- see point (6) below.

>>> special_match("az09.#")

False

>>> special_match("az09.X")

False

>>>

注意:在此答案中进一步使用re.match()进行了比较.进一步的时间表明match()将赢得更长的字符串; 当最终答案为True时,match()似乎比search()有更大的开销; 这很令人费解(也许是返回MatchObject而不是None的成本)并且可能需要进一步翻找.

==== Earlier text ====

[先前]接受的答案可以使用一些改进:

(1)演示文稿给出了交互式Python会话的结果:

reg=re.compile('^[a-z0-9\.]+$')

>>>reg.match('jsdlfjdsf12324..3432jsdflsdf')

True

但是match()没有返回 True

(2)与match()^一起使用时,模式的开头是多余的,并且看起来比没有相同模式的模式略慢^

(3)应该不经意地为任何重新模式促进原始字符串的使用

(4)点/周期前面的反斜杠是多余的

(5)比OP的代码慢!

prompt>rem OP's version -- NOTE: OP used raw string!

prompt>\python26\python -mtimeit -s"t='jsdlfjdsf12324..3432jsdflsdf';import

re;reg=re.compile(r'[^a-z0-9\.]')" "not bool(reg.search(t))"

1000000 loops, best of 3: 1.43 usec per loop

prompt>rem OP's version w/o backslash

prompt>\python26\python -mtimeit -s"t='jsdlfjdsf12324..3432jsdflsdf';import

re;reg=re.compile(r'[^a-z0-9.]')" "not bool(reg.search(t))"

1000000 loops, best of 3: 1.44 usec per loop

prompt>rem cleaned-up version of accepted answer

prompt>\python26\python -mtimeit -s"t='jsdlfjdsf12324..3432jsdflsdf';import

re;reg=re.compile(r'[a-z0-9.]+\Z')" "bool(reg.match(t))"

100000 loops, best of 3: 2.07 usec per loop

prompt>rem accepted answer

prompt>\python26\python -mtimeit -s"t='jsdlfjdsf12324..3432jsdflsdf';import

re;reg=re.compile('^[a-z0-9\.]+$')" "bool(reg.match(t))"

100000 loops, best of 3: 2.08 usec per loop

(6)可以产生错误的答案!!

>>> import re

>>> bool(re.compile('^[a-z0-9\.]+$').match('1234\n'))

True # uh-oh

>>> bool(re.compile('^[a-z0-9\.]+\Z').match('1234\n'))

False

+1谢谢你纠正我的回答.我忘记了匹配仅在字符串的开头检查匹配.Ingenutrix,我认为你应该选择这个答案. (3认同)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值