代码之家  ›  专栏  ›  技术社区  ›  Feng Chen

如何删除一些非英文字母的字符串?

  •  0
  • Feng Chen  · 技术社区  · 5 年前

    我对regex很陌生,python。例如,我的字符串列表是:

    my_try = ['Aas','1Aasdf','cc)','ASD','.ASD','aaaa1','A']
    

    现在,我想删除所有非英文字母的字符串。所以,我只想保持:

    ['Aas','ASD','A']
    

    我不知道怎么用^或别的什么来做这个?有人能帮我吗?

    如果我的数据是:

    my_try=pd.DataFrame({'try':
                             ['Aas','1Aasdf','cc)','A2SD','.ASD',
                              'aaaa1','A','123%']})
    

    然后我使用:

    [x for x in my_try if re.match(r'^[a-zA-Z]+$', x['try'])]
    

    为什么我会犯这样的错误:

    Traceback (most recent call last):
      File "C:\feng\myCode\infoExtract\venv\lib\site-packages\IPython    \core\interactiveshell.py", line 3319, in run_code
        exec(code_obj, self.user_global_ns, self.user_ns)
      File "<ipython-input-58-4bd95f31bd0c>", line 1, in <module>
        [x for x in my_try if re.match(r'^[a-zA-Z]+$', x['try'])]
      File "<ipython-input-58-4bd95f31bd0c>", line 1, in <listcomp>
        [x for x in my_try if re.match(r'^[a-zA-Z]+$', x['try'])]
     TypeError: string indices must be integers
    

    有谁能告诉我怎么解决这个问题,为什么会这样?

    1 回复  |  直到 5 年前
        1
  •  3
  •   Grismar    5 年前

    您有一个列表,并希望将其筛选为只包含与某些条件匹配的元素,使用 if 非常适合:

    my_list = [1, 2, 3, 4, 5, 6]
    # just even numbers:
    print([x for x in my_list if x % 2 == 0])
    

    您需要筛选仅包含字母“a”到“z”和“a”到“z”的任何内容,这是正则表达式易于使用的地方:

    my_try = ['Aas','1Aasdf','cc)','ASD','.ASD','aaaa1','A']
    print([x for x in my_try if re.match('^[a-zA-Z]+$', x)])
    

    正则表达式以 ^ 最后 $ 告诉 re.match() 它应该从头到尾匹配整个字符串。 [a-zA-Z] 定义包含要查找的字母的字符类。你经常会用 \w 但这也包括数字。最后 + 意味着字符串中需要有一个或多个字符(如果使用 * )