如何检查字符串中的特定字符?[关闭]


182

如何使用Python 2检查字符串中是否包含几个特定字符?

例如,给定以下字符串:

罪犯偷走了1,000,000美元的珠宝。

如何检测它是否带有美元符号(“ $”),逗号(“,”)和数字?


1
这是否意味着每个字符都应该是其中之一,或者字符串中是否包含这些字符中的一个(或全部)就足够了?他们必须按照某种顺序排列(例如:$ 2,00)才有效吗?
NullUserException 2011年

2
就像另一种方法一样,要测试的字符串not set(p).isdisjoint(set("0123456789$,"))在哪里p
凯文

Answers:


265

假设您的字符串是s

'$' in s        # found
'$' not in s    # not found

# original answer given, but less Pythonic than the above...
s.find('$')==-1 # not found
s.find('$')!=-1 # found

对于其他字符,依此类推。

... 要么

pattern = re.compile(r'\d\$,')
if pattern.findall(s):
    print('Found')
else
    print('Not found')

... 要么

chars = set('0123456789$,')
if any((c in chars) for c in s):
    print('Found')
else:
    print('Not Found')

[编辑:添加'$' in s答案]


20
s.find('$')!=-1=> '$' in s:-)
Jochen Ritzel 2011年

有什么特别的原因为什么on not found的值保持为-1而不是0?
akki 2014年

2
找不到@akki是-1,因为0是字符串中第一个字符的索引。因此,“ abc” .find('a')=0。如果0还是找不到值,那将是模棱两可的。
lemiant 2014年

1
我喜欢使用的最新版本any()。有没有办法以cpythonic样式引用找到的字符(似乎any()只限于内部),还是我需要使对几个字符的搜索更加明确?
詹斯

3
第二个示例已损坏:正则表达式需要带有方括号,r'[\d\$,]'以便与任何这些字符匹配,并且最后else:缺少冒号。
bjnord

23

用户Jochen Ritzel在评论用户dappawit对此问题的答案时说了这一点。它应该工作:

('1' in var) and ('2' in var) and ('3' in var) ...

“ 1”,“ 2”等应替换为您要查找的字符。

有关字符串的一些信息,请参见Python 2.7文档中的此页面,包括有关使用in运算符进行子字符串测试的信息。

更新:这与我上面的建议做的工作相同,重复次数更少:

# When looking for single characters, this checks for any of the characters...
# ...since strings are collections of characters
any(i in '<string>' for i in '123')
# any(i in 'a' for i in '123') -> False
# any(i in 'b3' for i in '123') -> True

# And when looking for subsrings
any(i in '<string>' for i in ('11','22','33'))
# any(i in 'hello' for i in ('18','36','613')) -> False
# any(i in '613 mitzvahs' for i in ('18','36','613')) ->True

+1比多个.find()更紧凑,并且只要搜索的字符数少即可。虽然不需要括号。
肖恩

1
@Sean关于括号:我知道,但是对我而言,始终使用它们比始终记住优先顺序要容易:-)。
Abbafei

11

快速比较时间,以回应Abbafei的帖子:

import timeit

def func1():
    phrase = 'Lucky Dog'
    return any(i in 'LD' for i in phrase)

def func2():
    phrase = 'Lucky Dog'
    if ('L' in phrase) or ('D' in phrase):
        return True
    else:
        return False

if __name__ == '__main__': 
    func1_time = timeit.timeit(func1, number=100000)
    func2_time = timeit.timeit(func2, number=100000)
    print('Func1 Time: {0}\nFunc2 Time: {1}'.format(func1_time, func2_time))

输出:

Func1 Time: 0.0737484362111
Func2 Time: 0.0125144964371

因此,任何代码都更紧凑,而条件代码则更快。


编辑: TL; DR-对于长字符串,if-then 仍然比任何字符串都快得多!

我决定根据评论中提出的一些有效点来比较长随机字符串的计时:

# Tested in Python 2.7.14

import timeit
from string import ascii_letters
from random import choice

def create_random_string(length=1000):
    random_list = [choice(ascii_letters) for x in range(length)]
    return ''.join(random_list)

def function_using_any(phrase):
    return any(i in 'LD' for i in phrase)

def function_using_if_then(phrase):
    if ('L' in phrase) or ('D' in phrase):
        return True
    else:
        return False

if __name__ == '__main__':
    random_string = create_random_string(length=2000)
    func1_time = timeit.timeit(stmt="function_using_any(random_string)",
                               setup="from __main__ import function_using_any, random_string",
                               number=200000)
    func2_time = timeit.timeit(stmt="function_using_if_then(random_string)",
                               setup="from __main__ import function_using_if_then, random_string",
                               number=200000)
    print('Time for function using any: {0}\nTime for function using if-then: {1}'.format(func1_time, func2_time))

输出:

Time for function using any: 0.1342546
Time for function using if-then: 0.0201827

如果-那么几乎比任何一个都快一个数量级!


1
正是我想知道的:-)
Lars

1
任何人都可以解释为什么有条件比使用任何条件都快吗?
乔什

@Josh可能是因为它更简单。Func1使用爆炸式列表理解功能,因此对于简单的事情,它的自动执行变得更加复杂。但是对于1000个字符,使用Func1可能会更快
-Hack5

@ Hack5假设phrase一个具有从A到Z的字母的字符串,并且我想打印字符串中不存在的字母会any()更好吗?还是有任何简短的检查方法?
Avishek Datta Ray

@Barefaced Bare在那种水平上,选择任何一个看起来更好的。速度可能并不重要,除非您要控制nukes(在这种情况下,您不应该使用python)
Hack5

5

这将测试字符串是否由某些组合或数字,美元符号和逗号组成。那是您要找的东西吗?

汇入

s1 ='测试字符串'
s2 ='1234,12345 $'

regex = re.compile('[0-9,$] + $')

如果(regex.match(s1)):
   打印“ s1匹配”
其他:
   打印“ s1不匹配”

如果(regex.match(s2)):
   打印“ s2匹配”
其他:
   打印“ s2不匹配”

如果$在字符类中,则不必转义$。而且这将匹配'testing $tring',我不认为这是OP希望发生的事情。
NullUserException 2011年

如果我没记错的话,'testing $tring'如果使用了该match方法,它将不会匹配它,仅当search使用了该方法时。所以我认为他的代码很好。
dappawit 2011年

@dappa '$string'虽然它仍然会匹配
NullUserException'3

-2
s=input("Enter any character:")   
if s.isalnum():   
   print("Alpha Numeric Character")   
   if s.isalpha():   
       print("Alphabet character")   
       if s.islower():   
         print("Lower case alphabet character")   
       else:   
         print("Upper case alphabet character")   
   else:   
     print("it is a digit")   
elif s.isspace():   
    print("It is space character")   

否则:
print(“非空间特殊字符”)


1
您能否为您的答案提供更多背景信息。
黄铜猴

检查字符串中字符的类型:isalnum():如果所有字符都是字母数字(a到z,A到Z,0到9),则返回True; isalpha():如果所有字符只是字母符号(a到z, A至Z),isdigit():如果所有字符均为数字,则返回True(0至9)islower():如果所有字符均为小写字母符号,则返回True。isupper():如果所有字符都是大写字母符号,则返回True。 istitle():如果字符串为首字母大写,则返回True isspace():如果字符串仅包含空格,则返回True @LazerBass
Nagaraj,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.