10

我更多地使用 R,并且在 R 中更容易做到这一点:

> test <- c('bbb', 'ccc', 'axx', 'xzz', 'xaa')
> test[grepl("^x",test)]
[1] "xzz" "xaa"

test但是如果是一个列表,如何在python中做到这一点?

PS我正在使用谷歌的python练习来学习python,我更喜欢使用正则表达式。

4

5 回答 5

11

一般来说,您可以使用

import re                                  # Add the re import declaration to use regex
test = ['bbb', 'ccc', 'axx', 'xzz', 'xaa'] # Define a test list
reg = re.compile(r'^x')                    # Compile the regex
test = list(filter(reg.search, test))      # Create iterator using filter, cast to list 
# => ['xzz', 'xaa']

或者,反转结果并获取所有与正则表达式不匹配的项目:

list(filter(lambda x: not reg.search(x), test))
# >>> ['bbb', 'ccc', 'axx']

请参阅Python 演示

使用说明

  • re.search在字符串中的任意位置找到第一个正则表达式匹配并返回一个匹配对象,否则None
  • re.match仅在字符串 start 处查找匹配,它不需要完整的字符串匹配。所以,re.search(r'^x', text)=re.match(r'x', text)
  • re.fullmatch仅当完整字符串与模式匹配时才返回匹配项,因此re.fullmatch(r'x')= re.match(r'x\Z')= re.search(r'^x\Z')

如果您想知道r''前缀的含义,请参阅Python - 在使用正则表达式查找句点(句号或 .)时,我应该使用字符串前缀 r 吗?Python 正则表达式 -r 前缀

于 2019-08-27T08:21:12.210 回答
4

您可以使用以下内容查找列表中的任何字符串是否以'x'

>>> [e for e in test if e.startswith('x')]
['xzz', 'xaa']
>>> any(e.startswith('x') for e in test)
True
于 2013-03-14T07:01:54.863 回答
2

你可以使用filter. 我假设您想要一个包含旧列表中某些元素的新列表。

new_test = filter(lambda x: x.startswith('x'), test)

或者,如果您想在过滤器函数中使用正则表达式,您可以尝试以下操作。它需要re导入模块。

new_test = filter(lambda s: re.match("^x", s), test)
于 2013-03-14T07:04:28.213 回答
1

当您想从列表中的每个字符串中提取多个数据点时的示例:

输入:

2021-02-08 20:43:16 [debug] : [RequestsDispatcher@_execute_request] Requesting: https://test.com&uuid=1623\n

代码:

pat = '(.* \d\d:\d\d:\d\d) .*_execute_request\] (.*?):.*uuid=(.*?)[\.\n]'
new_list = [re.findall(pat,s) for s in my_list]

输出:

[[('2021-02-08 20:43:15', 'Requesting', '1623')]]
于 2021-02-08T20:45:06.027 回答
0

这是一些很好的即兴创作。可能有帮助..

import re
l= ['bbb', 'ccc', 'axx', 'xzz', 'xaa'] #list
s= str( " ".join(l))                   #flattening list to string
re.findall('\\bx\\S*', s)               #regex to find string starting with x

['xzz', 'xaa']
于 2020-08-10T15:17:05.070 回答