我有一个csv文件,看起来像这样(显然
<anystring>tony_UPearly_start,1,2,3
<anystring>tony_UPlate_start,4,5,6
<anystring>tony_UP<anystring>_start,7,8,9
<anystring>jane_UPearly_start,1,2,3
<anystring>jane_UPlate_start,4,5,6
<anystring>jane_UP<anystring>_start,7,8,9
我正尝试使用否定的期望来排除行1,2和4,5的行UPanystring(在本示例中为行3和6)
import re
import csv
search = re.compile(r'.*_UP(?!early|late)')
output = []
with open('test.csv', mode='r', encoding='utf-8') as f:
csvfile = csv.reader(f)
for row in csvfile:
if row[0] == search:
output.append(row)
print(output)
>>>[]
我在什么时候
print (output)
[<anystring>tony_UP<anystring>_start,7,8,9, <anystring>jane_UP<anystring>_start,7,8,9]
当我在regex平台上进行测试但不在python中进行测试时,正则表达式搜索有效吗?
感谢您的评论:搜索代码现在看起来像
search = re.compile(r'^.*?_UP(?!early|late).*$')
output = []
with open('test.csv', mode='r', encoding='utf-8') as f:
csvfile = csv.reader(f)
for row in csvfile:
search.search(row[0]) # it think this needs and if=true but it won't accept a boolean here?
output.append(row)
现在返回所有行(即不过滤任何内容,而在过滤所有内容之前)
答案 0 :(得分:0)
您要返回包含_UP
而不是early
或late
的行的列表。
图案应该看起来像
search = re.compile(r'_UP(?!early|late)')
您不需要任何^
,.*
等,因为当您使用re.search
时,您正在查找字符串内任何地方的模式匹配。
然后,您只需要测试正则表达式匹配的行即可:
if search.search(row):
output.append(row)
请参见Python demo:
import re
csvfile="""<anystring>tony_UPearly_start,1,2,3
<anystring>tony_UPlate_start,4,5,6
<anystring>tony_UP<anystring>_start,7,8,9
<anystring>jane_UPearly_start,1,2,3
<anystring>jane_UPlate_start,4,5,6
<anystring>jane_UP<anystring>_start,7,8,9""".splitlines()
search = re.compile(r'_UP(?!early|late)')
output = []
for row in csvfile:
if search.search(row):
output.append(row)
print(output)
输出是您期望的列表:
['<anystring>tony_UP<anystring>_start,7,8,9', '<anystring>jane_UP<anystring>_start,7,8,9']