0

我正在编写一个脚本来解析文本文件(准确地说是 csv),我想根据每行内容从文件中选择行。有许多字符串条件要检查,所以我推测 regexp 是要走的路,但我还需要根据模算术中的条件检查一行开头的一个数字,到目前为止它是n%4==kand n%2==k。然而,似乎只有临时解决方案。n%2==k很简单,但要检查n%4==2我必须设计这样的东西:

r'((^\d*[24680]|^)[26]|^\d*[13579][048])[\s;,].*' # more (unrelated) conditions follow

我的问题是:

  1. 有没有办法简化上面的正则表达式?它有什么明显的问题吗?
  2. 如果我想将脚本推广到其他模条件(例如n%3==kn%7==k),是否有一种可行的方法来使用正则表达式,或者我最好从字符串中提取一个数字并编写额外的代码来检查这些条件。
4

1 回答 1

1

这似乎更准确n%4==2(参考:http ://en.wikipedia.org/wiki/Divisibility_rule )

r = r'^[26]$|^\d*[02468][26]$|^\d*[13579][048]$'

# test
for i in xrange(1, 1000):
    m = re.match(r, str(i))
    if i % 4 == 2:
        assert m, [i, i % 4]
    else:
        assert not m, i

有关可被 3n%3==0整除的正则表达式过滤器编号。我不知道任何通用的解决方案mod n,无论如何这将是一个有趣但纯粹的理论练习。在现实生活中,只需使用整数。

于 2012-09-13T08:43:45.127 回答