Python多行正则表达式在shell中工作,但不在程序中

时间:2014-11-17 18:11:03

标签: python regex

我正在尝试在JSON Feed中查找并替换多行模式。基本上,我正在寻找以“}”结尾的行,后面跟着只有“}”的行。

示例输入为:

s = """
              "essSurfaceFreezePoint":    "1001",
              "essSurfaceBlackIceSignal": "4"
              },
            }
          }
"""

我想找到:

"""
              },
            }
"""

并将其替换为:

"""
              }
            }
"""

我尝试了以下内容:

pattern = re.compile(r'^ *},\n^ *}$',flags=re.MULTILINE)
pattern.findall(feedStr)

这适用于python shell。但是,当我在我的python程序中进行相同的搜索时,它什么也没找到。我在程序中使用完整的JSON提要。也许在阅读Feed时会有不同的行终止。

Feed位于:

http://hardhat.ahmct.ucdavis.edu/tmp/test.json

如果有人能指出为什么这在shell中工作,而不是在程序中,我会非常感激。有没有更好的方法来制定正则表达式,所以它可以在两者中工作?

感谢您的任何建议。

=============================================== ======================================

为了更清楚,我在这里添加我的测试代码。请注意,我现在包括Ahosan Karim Asik提供的正则表达式。这个正则表达式在下面的实时演示链接中工作,但在python shell中对我不起作用。它也不适用于真实的饲料。

再次感谢您的帮助。

import urllib2
import json
import re

if __name__ == "__main__":
    # wget version of real feed:
    # url = "http://hardhat.ahmct.ucdavis.edu/tmp/test.json"
    # Short text, for milepost and brace substitution test:
    url = "http://hardhat.ahmct.ucdavis.edu/tmp/test.txt"
    request = urllib2.urlopen(url)
    rawResponse = request.read()
    # print("Raw response:")
    # print(rawResponse)

    # Find extra comma after end of records:
    p1 = re.compile('(}),(\r?\n *})')
    l1 = p1.findall(rawResponse)
    print("Brace matches found:")
    print(l1)

    # Check milepost:
    #p2 = re.compile('( *\"milepost\": *\")')
    p2 = re.compile('( *\"milepost\": *\")([0-9]*\.?[0-9]*)\r?\n')
    l2 = p2.findall(rawResponse)
    print("Milepost matches found:")
    print(l2)

    # Do brace substitutions:
    subst = "\1\2"
    response = re.sub(p1, subst, rawResponse)

    # Do milepost substitutions:
    subst = "\1\2\""
    response = re.sub(p2, subst, response)
    print(response)

1 个答案:

答案 0 :(得分:0)

试试这个:

 import re
    p = re.compile(ur'(^ *}),(\n^ *})$', re.MULTILINE)
    test_str = u" \"essSurfaceFreezePoint\": \"1001\",\n \"essSurfaceBlackIceSignal\": \"4\"\n },\n }\n }"
    subst = u"$1$2"

    result = re.sub(p, subst, test_str)

live demo