我在文件中有一系列字符串。有些行包含" date"而其他人包含价值观。我试图选择那些包含"字符串日期"的行。格式为" 2010-10-01 - 2015-05-01"。
for row in csvReader:
if any('-' and '-' in s for s in row):
data.append(row)
我的前几次尝试围绕着抓住包含一个破折号或两个短划线的行。但是,我不断获得不应该达到的价值,例如下面的内容:
0 United States; 2004 - present None
1 2004-01-04 - 2004-01-10 23
2 2004-01-11 - 2004-01-17 23
3 2004-01-18 - 2004-01-24 23
617 2015-10-25 - 2015-10-31 24
618 2015-11-01 - 2015-11-07 25
619 2015-11-08 - 2015-11-14 26
620 2015-11-15 - 2015-11-21
621 Spokane WA 20
622 New York NY 20
所以在上面的数据中,我不应该使用US和非第一行。此外,我不应该在最后两行中获得字符串。
有人能告诉我为什么我的if语句没有抓住正确的内容吗?
答案 0 :(得分:1)
嗨,请尝试这个小解决方案:
import re
mystring = """
0 United States; 2004 - present None
1 2004-01-04 - 2004-01-10 23
2 2004-01-11 - 2004-01-17 23
3 2004-01-18 - 2004-01-24 23
617 2015-10-25 - 2015-10-31 24
618 2015-11-01 - 2015-11-07 25
619 2015-11-08 - 2015-11-14 26
620 2015-11-15 - 2015-11-21
621 Spokane WA 20
622 New York NY 20
"""
result = re.findall(r"(?:[0-9]+-[0-9]+-[0-9]+)+", mystring)
for x in result:
print(x)
您可以尝试运行实时代码here
准确表示您的问题
根据以下评论进行编辑,因为您希望每行有2组日期
dates = []
for row in csvReader:
l = re.findall(r"(?:[0-9]+-[0-9]+-[0-9]+)+", row)
if l:
dates.append(l)
print(dates)
输出
['2004-01-04', '2004-01-10']
['2004-01-11', '2004-01-17']
['2004-01-18', '2004-01-24']
['2015-10-25', '2015-10-31']
['2015-11-01', '2015-11-07']
['2015-11-08', '2015-11-14']
['2015-11-15', '2015-11-21']
答案 1 :(得分:1)
首先,'-' and '-' in s for s in row
不是真的!例如,看看这段代码:
In [1]: x = '-'
In [2]: '-' and '-' in x
Out[2]: True
第二,为了解决你的问题,我认为使用正则表达式是一个不错的选择:
>>> m = re.search('[a-z]*(\d{4}-\d{2}-\d{2})', 'The date is 2004-01-01') #add each line instead of 2nd argument
>>> m
<_sre.SRE_Match object at 0x02229720>
>>> m.group()
'2004-01-01'
答案 2 :(得分:1)
这类似于ishan的解决方案,但是稍微好一点的日期检查,它将创建你想要的列表,同样通过编译正则表达式它将比大数据集更快:
import re
datex = re.compile('(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])')
xl = """
0 United States; 2004 - present None
1 2004-01-04 - 2004-01-10 23
2 2004-01-11 - 2004-01-17 23
3 2004-01-18 - 2004-01-24 23
617 2015-10-25 - 2015-10-31 24
618 2015-11-01 - 2015-11-07 25
619 2015-11-08 - 2015-11-14 26
620 2015-11-15 - 2015-11-21
621 Spokane WA 20
622 New York NY 20
"""
dates = []
for ln in xl.splitlines():
if datex.search(ln):
dates.append(ln)
只需用文件中的读取
替换xl ....中的for ln