【问题标题】:How to check a string for specific characters?如何检查字符串中的特定字符?
【发布时间】:2011-07-08 12:14:07
【问题描述】:

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

例如,给定以下字符串:

犯罪分子偷走了价值 1,000,000 美元的珠宝。

如何检测它是否包含美元符号 ("$")、逗号 (",") 和数字?

【问题讨论】:

  • 这是否意味着每个字符都应该是这些字符之一,还是这些字符中的一个(或全部)出现在字符串中就足够了?它们是否必须按某种顺序(例如:2.00 美元)才有效?
  • 就像另一种方法一样,not set(p).isdisjoint(set("0123456789$,")) 其中p 是要测试的字符串。

标签: python string


【解决方案1】:

这将测试字符串是否由某些组合或数字、美元符号和逗号组成。这就是你要找的吗?

重新进口 s1 = '测试字符串' s2 = '1234,12345$' 正则表达式 = re.compile('[0-9,$]+$') 如果(正则表达式匹配(s1)): 打印“s1 匹配” 别的: 打印“s1 不匹配” 如果(正则表达式匹配(s2)): 打印“s2匹配” 别的: 打印“s2 不匹配”

【讨论】:

  • 如果 $ 在字符类中,您不必转义它。这也将匹配'testing $tring',我认为这不是 OP 想要发生的事情。
  • 如果我没记错的话,如果使用match 方法,它不会匹配'testing $tring' 它,只有在使用search 时才会匹配。所以我认为他的代码很好。
  • @dappa 它仍然会匹配'$string'
【解决方案2】:

假设你的字符串是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 答案]

【讨论】:

  • s.find('$')!=-1 => '$' in s :-)
  • 是否有任何特殊原因将未找到的值保留为 -1 而不是 0 ??
  • @akki not found 为 -1,因为 0 是字符串中第一个字符的索引。因此 "abc".find('a') = 0。如果 0 也是未找到的值,那将是不明确的。
  • 我喜欢使用any() 的最后一个版本。有没有办法以 Python 风格引用找到的字符 c(它似乎只在 any() 范围内),还是我需要更明确地搜索几个字符?
  • 第二个例子坏了:正则表达式需要有括号 r'[\d\$,]' 以便匹配任何这些字符,而 else: 末尾缺少冒号。
【解决方案3】:

用户 Jochen Ritzel 在评论用户 dappawit 对此问题的回答时说。 它应该工作:

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

'1'、'2'等应替换为您要查找的字符。

请参阅this page in the Python 2.7 documentation 了解有关字符串的一些信息,包括有关使用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() 更紧凑,只要搜索的字符数少就可以了。不过不需要括号。
  • @Sean 关于括号:我知道,但是总是使用它们比总是记住优先顺序更容易:-)。
【解决方案4】:

快速比较响应 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

所以代码在 any 下更紧凑,但在条件下更快。


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

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

# 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

If-then 几乎比任何方法都快一个数量级!

【讨论】:

  • 谁能解释为什么条件比使用任何条件要快得多?
  • @Josh 可能是因为它更简单。 Func1 使用分解列表推导,因此对于简单的事情它会自动变得更复杂。但是对于 1000 个字符,使用 Func1 可能会更快
  • 这是非常具有误导性的。性能差异是由于在为 any() 设置生成器表达式时遇到的问题。将字符串大小增加到 2000 几乎没有任何作用,因为它几乎总是会在随机字符串的前 256 个字符中找到一个“L”字符。如果你要在前面添加 2000 个空格,那么差异会小得多。
【解决方案5】:
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("非空格特殊字符")

【讨论】:

  • 能否为您的回答提供更多背景信息。
  • 检查字符串中存在的字符类型: isalnum():如果所有字符都是字母数字(a 到 z,A 到 Z,0 到 9),则返回 True isalpha():如果所有字符都是only letters symbols(a to z,A to Z) , isdigit():如果所有字符都是数字(0到9),则返回True islower():如果所有字符都是小写字母符号,则返回True isupper():返回True如果所有字符都是大写的 aplhabet 符号 istitle():如果字符串在标题大小写中,则返回 True isspace():如果字符串仅包含空格,则返回 True @LazerBass
【解决方案6】:

我的简单,简单,简单的方法! =D

代码

string_to_test = "The criminals stole $1,000,000 in jewels."
chars_to_check = ["$", ",", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
for char in chars_to_check:
    if char in string_to_test:
        print("Char \"" + char + "\" detected!")

输出

Char "$" detected!
Char "," detected!
Char "0" detected!
Char "1" detected!

【讨论】:

    【解决方案7】:

    检查字符是否在字符串中:

    parse_string = lambda chars, string: [char in string for char in chars]
    

    示例:

    parse_string('$,x', 'The criminals stole $1,000,000 in ....') 
    

    parse_string(['$', ',', 'x'], '..minals stole $1,000,000 i..')
    

    输出:[True, True, False]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      • 2013-11-27
      • 2013-10-21
      • 2013-10-19
      相关资源
      最近更新 更多