根据特定值对字符串进行子集

时间:2015-11-18 20:03:25

标签: python

我在文件中有一系列字符串。有些行包含" 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语句没有抓住正确的内容吗?

3 个答案:

答案 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