【问题标题】:Python re.match word countPython re.match 字数
【发布时间】:2021-11-29 01:39:11
【问题描述】:

我想查找并打印所有以 M 开头并且仅包含一次 i 或 I 的状态。我试图先找到 M 包含状态并计算 i 序列..

import re
pattern = 'i'
state_names=['Alabama','Alaska','Arizona','Arkansas','California','Colorado','Connecticut',
'Delaware','Florida','Georgia','Hawaii','Idaho','Illinois','Indiana',
'Iowa','Kansas','Kentucky','Louisiana','Maine','Maryland','Massachusetts',
'Michigan','Minnesota','Mississippi','Missouri','Montana','Nebraska','Nevada',
'New Hampshire','New Jersey','New Mexico','New York','North Carolina','North Dakota','Ohio',
'Oklahoma','Oregon','Pennsylvania','Rhode Island','South Carolina','South Dakota','Tennessee',
'Texas','Utah','Vermont','Virginia','Washington','West Virginia','Wisconsin',
'Wyoming']
m_word=['']

for k in range (len(state_names)):
  state=state_names[k]
  mword=m_word[k]
  mword.append(re.search('^M',state))

  left = 0
  count = 0
  while True:
      match = re.search(pattern, mword)
      if not match:
          break
      count += 1
      left += match.start() + 1
      for i in range (len(m_word)):
          if (count==1):
              print(mword[i])
  print(count)

【问题讨论】:

  • 嗯,您有什么理由想尝试使用re 模块?
  • 还要澄清一下,您要匹配的是小写的 I 还是 L(不是大写的“i”)?

标签: python python-re


【解决方案1】:

这个任务有很多代码 - 我会做一些更简单的事情,比如:

m_states = [state for state in state_names if state[0] == "M"]
answers = [m_state for m_state in m_states if m_state.count("i") + m_state.count("I") == 1]

编辑:感谢佩德罗的评论 - 更新:

m_states = [state for state in state_names if state.startswith("M")]
answers = [m_state for m_state in m_states if m_state.lower().count("i") == 1]

编辑:而且,也许更简单一点:

answers = [state for state in state_names if state.startswith("M") and state.lower().count("i") == 1]

【讨论】:

  • 建议使用.startswith 并在检查计数之前将m_state 转换为更低:if m_state.lower().count("i") == 1]
【解决方案2】:

你可以使用filter,返回iterator

list(filter(lambda x: x.startswith('M') and (x.count("i") == 1), state_names))

【讨论】:

    【解决方案3】:

    正则表达式必然会使它变得更复杂。 这是简单的解决方案。

    >>> state_names=['Alabama','Alaska','Arizona','Arkansas','California','Colorado','Connecticut',
    ... 'Delaware','Florida','Georgia','Hawaii','Idaho','Illinois','Indiana',
    ... 'Iowa','Kansas','Kentucky','Louisiana','Maine','Maryland','Massachusetts',
    ... 'Michigan','Minnesota','Mississippi','Missouri','Montana','Nebraska','Nevada',
    ... 'New Hampshire','New Jersey','New Mexico','New York','North Carolina','North Dakota','Ohio',
    ... 'Oklahoma','Oregon','Pennsylvania','Rhode Island','South Carolina','South Dakota','Tennessee',
    ... 'Texas','Utah','Vermont','Virginia','Washington','West Virginia','Wisconsin',
    ... 'Wyoming']
    >>> 
    >>> for word in state_names:
    ...     if word.startswith('M'):
    ...             letters = [ l.lower() for l in word]
    ...             if letters.count('i')==1:
    ...                     print(word)
    ... 
    Maine
    Minnesota
    >>> 
    

    【讨论】:

    • 您不需要使用list 理解。您可以将单词转换为小写并改用str.count
    • 好的,刚刚检查过了。 >>> x = '你好' >>> x.count('l') 2
    猜你喜欢
    • 1970-01-01
    • 2023-01-31
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    相关资源
    最近更新 更多