【问题标题】:Python re pattern matchingPython重新模式匹配
【发布时间】:2013-02-15 01:14:39
【问题描述】:

我正在尝试使用 re 模块解决正则表达式识别问题。 我想从文件中复制一些以 * 开头的行,确切的行模式是:

*7  3   279 0

在字符中有制表符。 我与这些行匹配的正则表达式是:

regex=re.compile(r'^\*\d+.\n', re.MULTILINE)
for line in f:
    if regexp.match(line)
    print >> a, line

我编写的脚本创建了文件“a”,但它是空的,它无法识别模式。 你有什么建议吗?

此外,你能解释一下双引号和单引号模式之间的区别吗?我搜索了几本python手册,但没有找到任何信息。

【问题讨论】:

  • 在 Python 中,单引号和双引号字符串没有区别。
  • 另外,如果您正在逐行处理输入文件,您似乎不需要多行匹配。使用正则匹配,并尝试搜索$ 而不是\n

标签: python regex


【解决方案1】:

你没有用你的正则表达式捕获整个行,你只会匹配类型的行:

*7

^\*(?:\d+\s+)+$ 之类的东西应该可以工作,不需要多行,因为您将正则表达式应用于文件的每一行。

编辑: 更改为非捕获组,因为它不需要。

【讨论】:

    【解决方案2】:

    假设你只在行首寻找*+number,你只需要这样做:

    regex=re.compile(r'\*\d+')
    for line in f:
        if regexp.match(line)
        print >> a, line
    

    如果您关心用空格分隔的数字的数量:

    regex=re.compile(r'\*(?:\d+\s+){3}\d+')
    for line in f:
        if regexp.match(line)
        print >> a, line
    

    如果您使用re.match,则不需要^ 锚。如果您使用re.search,您可以使用。 See the docs

    【讨论】:

      【解决方案3】:

      试试这个:

       re.compile(r'^\*\d\s+\d+\s+')
      

      【讨论】:

        【解决方案4】:

        不知道python,但似乎正则表达式应该是这个^[*][\d(\s)*]+$

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-14
          • 2012-02-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多