【问题标题】:How to match info from a string如何匹配字符串中的信息
【发布时间】:2011-01-12 13:38:58
【问题描述】:

我有一个带有版本号的字符串。我想从此代码中读取版本号,以便将其与我正在使用的其他代码进行比较。我在下面完成了代码,但无法使其正常工作,任何人都可以看到问题吗?

print results

    r = re.compile(r'(version\s*\s*)(\S+)') 

    for l in results: 
        m1 = r.match(l) 
        if m1: 
            ID=map(int,m1.group(2).split("."))  
            l = r.sub(r'\g<1>' + '.'.join(['%s' % (v) for v in ID]), l)
            print ID

结果变量是:

Name Info Type Call version 1.0.40.437 Fri Oct  2 10:54:35 BST 2009

我这样做是因为我需要将 ID 中的数字分成组,因为我需要将 ID 中的第三个数字与另一个文件中 ID 中的第三个数字进行比较。

以下答案很有用,但我使用它的方式是读取文件并将所有数字取出并将它们放入列表中,因此我所要做的就是比较列表中的两个数字。抱歉,如果问题不清楚,但我不希望版本号是字符串。

好的,我对下面回答的代码进行了一些更改。代码如下:

    version = re.compile('version\s+([\d.]+)\s+') 
    ID = version.search(results) 
    if ID: 
        value = ID.group(1).split('.')[2]

    self.assertEqual(BUILD_ID[2], int(value))

这不会创建我想要的列表,但它允许我比较两个值。

感谢大家的帮助。

【问题讨论】:

  • 什么是“结果”?如果它是一个字符串,你的循环会遍历每个字符,而不是每个单词。
  • \s*\s* 等价于\s*。你想在那里做什么?

标签: python search string


【解决方案1】:

为什么是正则表达式?我应该使用 split(' ') 并使用 'version' 旁边的值,或者更简单:

print results.split(' ')[5]

如果您必须使用正则表达式,请尝试:

rx = re.compile('version\s+([\d.]+)\s+')
rxx = rx.search(results)
if rxx:
    print rxx.group(1)

【讨论】:

  • [\d|\.] 不会做你认为它会做的事;你的意思是[\d.]
  • \d 表示数字,\. 表示版本信息中分隔数字的点。我认为\S 会更好,如果版本信息可以包含来自 TotalCommander 的7.50a 之类的信息:)
  • ł:点在字符类中没有特殊含义。它不需要逃避。另外,一个字符类总是说“其中之一”,除非你想匹配它,否则你不能包含|
  • 谢谢。我将[\d|\.] 更改为[\d.]
【解决方案2】:

以下答案很有用,但我的方法是读取文件并将所有数字取出并将它们放入列表中,因此我所要做的就是比较列表中的两个数字。

我将假设版本格式是固定的(即version.major.minor.revision)。

reVersion = re.compile( 'version\s+((((\d+)\.(\d+))\.(\d+)).(\S+))\s+', re.I )

for result in results:
    versionMatch = reVersion.match( result )
    if versionMatch:
        version = versionMatch.groups()
        print( version[0] ) # 1.0.40.437  full version
        print( version[1] ) # 1.0.40      version.major.minor - no revision
        print( version[2] ) # 1.0         version.major
        print( version[3] ) # 1           version
        print( version[4] ) # 0           major
        print( version[5] ) # 40          minor
        print( version[6] ) # 437         revision

【讨论】:

    【解决方案3】:
    >>> import re
    >>> results = "Name Info Type Call version 1.0.40.437 Fri Oct  2 10:54:35 BST 2009"
    >>> m = re.search("version ([^ ]+)", results)
    >>> if m:
    ...   version = m.group(1)
    ...   print "matched, found:", version
    ... else:
    ...   print "didn't find a version"
    ... 
    matched, found: 1.0.40.437
    

    【讨论】:

      【解决方案4】:
      >>> r = re.compile(r'version (\S*)')
      >>> r.findall(results)
      ['1.0.40.437']
      

      非正则表达式方式

      >>> m=results.split()
      >>> m[m.index('version')+1]
      '1.0.40.437'
      

      【讨论】:

        【解决方案5】:

        我可以发现几件事:

        • 您说 results 是一个字符串,但您正在遍历它 - 所以 l 每次都是一个字符。

        • re.match 仅匹配字符串的开头。请改用re.search

        【讨论】:

          【解决方案6】:

          这是一种非正则表达式

          >>> s="Name Info Type Call version 1.0.40.437 Fri Oct  2 10:54:35 BST 2009".split()
          >>> for n,i in enumerate(s):
          ...   if "version" in i:
          ...     print s[n+1]
          ...
          1.0.40.437
          >>>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-01-02
            • 2012-03-20
            • 1970-01-01
            • 1970-01-01
            • 2016-05-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多