regex 如何使用正则表达式在列表中找到这些确切的字符(我们迭代列表)

lf5gs5x2  于 2023-08-08  发布在  其他
关注(0)|答案(3)|浏览(94)

现在我遇到了一个问题:我需要计算每个数字在一个字符串中出现的次数。举例来说:Tran Yen Nhi sn 23 06 2003应该给予结果:{'0':3 , '2':2 , '3':2 , '6':1}我通过使用正则表达式或迭代文本完成了它。但我想用另一种方式解决。以下是我的想法:

  • 如果我可以使用正则表达式找到该字符串中的所有数字'0',它将为我返回'0'的列表。然后我可以使用len(list)来查找它出现的次数
  • 与其他数字相同,因此我认为我需要迭代range (0,10)中的数字
  • 这是我尝试的:
for i in range(0,10):    
    number = re.findall([i],string)    
    count = len(number)    
    dictionary[number] = count

字符串
它得到了traceback:不可哈希类型:如何修复此代码?提前感谢您花时间回答我的问题

lfapxunr

lfapxunr1#

迭代序列,检查字符是否为数字,并递增字典计数。

occurrences = {}
for character in my_string:
  if character.isdigit():
    try:
      occurrences[character] += 1
    except KeyError:
      occurrences[character] = 0

字符串

pkbketx9

pkbketx92#

你可以用collections.Counter()和一个generator comprehension来解决这个问题:

from collections import Counter

counter = Counter(char for char in string if char.isdigit())

字符串
试试看:

print(counter)        # Counter({'2': 2, '3': 2, '0': 3, '6': 1})
print(dict(counter))  # {'2': 2, '3': 2, '0': 3, '6': 1}


对于这个简单的任务,正则表达式并不是必需的,但是如果你愿意,你可以用\d匹配所有的数字,然后从结果列表中构造一个Counter

import re

digits = re.findall(r'\d', string)  # ['2', '3', '0', '6', '2', '0', '0', '3']
counter = Counter(digits)


注意re.findall()的第一个参数不能是列表。也就是说,re.findall([i], string)是错误背后的罪魁祸首。然而,即使它接受这样的参数,dictionary[number]也会导致同样的错误,因为number也是一个列表(re.findall()总是返回一个列表)。
如果你想坚持使用循环而不是Counter(),可以使用string.count()

dictionary = {}

for digit in range(10):
  count = string.count(str(digit))
  dictionary[str(digit)] = count


但是,这也将记录计数为0的数字:

print(dictionary)   # {'0': 3, '1': 0, '2': 2, '3': 2, '4': 0, '5': 0, '6': 1, '7': 0, '8': 0, '9': 0}


re.findall()也是如此:

for digit in range(10):
  occurences = re.findall(str(digit), string)
  count = len(occurences)
  dictionary[str(digit)] = count

print(dictionary)   # {'0': 3, '1': 0, '2': 2, '3': 2, '4': 0, '5': 0, '6': 1, '7': 0, '8': 0, '9': 0}

c86crjj0

c86crjj03#

在你试图以这种特殊的方式做这件事的过程中有三个问题:

  1. [i]不是re.findall的有效第一个参数。应为字符串。所以通过str(i)
  2. number是一个列表,所以dictionary[number]没有意义。您需要dictionary[i]
    1.您只想在出现次数不为零时进行注册,因此需要一个if保护。
    更正:
for i in range(10):    
    number = re.findall(str(i), string)  # fix first argument
    count = len(number)
    if count:  # don't register zeroes
        dictionary[i] = count  # fix the key: it is the digit.

字符串
注:通过给出更好的名称,您可以避免第二个问题。因为number是一个列表,所以我用复数来命名它。此外,“数字”可以由若干“数字”组成。您在这里的意思是“digit”,因此将列表命名为digits
当然,这不是最有效的处理方式。可以使用collections.Counter

dictionary = Counter(re.findall(r"\d", string))

相关问题