Python 用于查找从开始到返回后的值的正则表达式

Python 用于查找从开始到返回后的值的正则表达式,python,regex,Python,Regex,我有多个这样的文件: 11111111111111 11010111101101 11110011110101 10014000010001 13500000101111 11108000010161 10100101111501 10000600116051 11011001000101 110080101158001 10012001010001 11111111111111 我计算了所有这些文件的行数和列数。 现在我试图写一些,以确保所有这些文件都以一行1开头 我遇到的第二个问题是查找所

我有多个这样的文件:

11111111111111
11010111101101
11110011110101
10014000010001
13500000101111
11108000010161
10100101111501
10000600116051
11011001000101
110080101158001
10012001010001
11111111111111
我计算了所有这些文件的行数和列数。 现在我试图写一些,以确保所有这些文件都以一行1开头


我遇到的第二个问题是查找所有行的长度等于列数的文件。在这种情况下,我们不能用正则表达式选择第10行

我想这就是你第一个问题的答案:

^1+\s*\n
  • ^
    字符串的开头
  • 1+
    字符
    1
    ,至少重复一次
  • \s*
    未定义的空格数(零、一个或多个)
  • \n
    行尾

    • 我们如何避免使用正则表达式,一次只读取一行文件

      def fileFormatIsCorrect(filename):
          lines = open(filename).readlines()
      
          for i in range(0, len(lines)):
              line = lines[i]
      
              # check for the initial row of ones
              if i == 0 and not (line.strip().replace("1","") == ""):
                  return False
              if len(line) != len(lines):
                  return False
          return True
      

      如果您只想知道第一行是否包含所有的1,只需查看第一行即可。读取整个文件会使事情过于复杂。试图找出要查找多少个1而不是“全部”会使事情过于复杂。保持简单

      with open(filename) as f:
          line = next(f, 'X').strip()
          if all(c == '1' for c in line):
              # yes
      
      或者,如果你想变得聪明一点:

      with open(filename) as f:
          line = next(f, 'X').strip()
          if not line.replace('1', ''):
              # yes
      
      或者,如果您确实想使用正则表达式:

      with open(filename) as f:
          line = next(f, 'X').strip()
          if re.match(r'^1+$', line):
              # yes
      

      Jon Clements建议,
      next(f,'X')
      确保一个空文件不会引发异常,并且测试也会失败(因为
      'X'.strip()
      不是由所有1组成的)。

      首先为什么要在那里使用
      %g
      %f
      <代码>{10.000000}不是有效的重复计数。这就是您试图创建的模式吗?为什么最后的
      \s
      ?这些行是否以空格结尾?还有,为什么您首先要寻找0个或多个10 1的副本,然后再寻找另一个10 1?这个模式应该是什么意思?最后,你为什么要首先使用
      findall
      ?如果您试图检查第一行是否都是
      1
      s,只需查看第一行,或者获取第一个匹配项并验证它是否从位置0开始,或者……除了迭代文件中的所有匹配项,然后试图找出如何在您已经看到第一行之后不看到它们以外的任何内容。@bakuriu确实如此。所有这些行都以一个空格结尾。根据OP的评论,您可能希望在
      \r
      之前添加一个空格(可能是可选的或重复的)。谢谢,没有看到这种新颖性:)第一行只包含
      1
      s如何?好的,如果不是下一行(f,'Z')。strip()。translate(无,'1'),但是。。。这看起来将是最全面的答案:)@JonClements:是的,但是尝试编写在2.x和3.x中都能工作的
      str.translate
      代码是额外的特别乐趣。:)虽然,现在我在美学上思考
      line=next(f',).strip()
      然后
      如果行而不是…
      但是无论如何,我现在就闭嘴:)