【问题标题】:get string value from list by regex通过正则表达式从列表中获取字符串值
【发布时间】:2017-12-18 20:15:11
【问题描述】:

我有两个字符串:

num = '#123'

line = '#123 random text generator #111 #222 #333'

我希望得到'#xyz' if num == first number in line.格式的所有数字

我已使用正则表达式通过以下方式获取第一个数字 (#123)

re.findall(r'[#]\d{3,10}', line)

我尝试通过以下方式测试这种情况:

if re.findall(r'[#]\d{3,10}', line)[:1] == num:

我试图将 re.findall 放入一个参数并打印它的长度和类型,它说它的长度为 0 和类型列表。这让我很困惑,因为 [:1] 应该给我它找到的 '#123' 字符串吗?列表似乎是空的,但我不知道为什么。

更具体地说,我的代码有matrix = [['#123'] ['#234'] ['#345'] ['#666']]

def test(matrix,txt):
  for num_group in matrix:
    print num_group
    for num in num_group:
      for line in txt:
        if re.findall(r'[#]\d{3,10}', line)[:1] == num:
          print "found some more numbers in the line number!"
          print line
          more_nums = re.findall(r'[#]\d{3,10}', line)[1:]
          matrix[num_group].append(nums)

所以我的最终结果应该将#111 #222#333 附加到包含#123matrix[0]

【问题讨论】:

  • 你应该为你正在使用的语言添加一个标签。
  • 抱歉 :)
  • 你可以使用 PyPi 正则表达式模块吗?然后你可以用一种模式来做。还是您仅限于 Python re
  • 我对 PyPi 不熟悉,但我希望它尽可能简单,所以我想除了我所做的之外不需要任何外部模块。它也应该适用于我的代码..
  • 什么是num?它是一个字符串吗?现在它看起来像一条评论。

标签: python regex string list


【解决方案1】:

您可以通过python字符串内置方法'startswith'进行检查,然后您可以在那里使用一些逻辑,这是我的方法:

import re
pattern=r'#\d+'
num = '#123'

line = '#123 random text generator #111 #222 #333'

matrix = [['#123'],['#234'],['#345'],['#666']]

if line.startswith(num):
    match=re.findall(pattern,line)
    for index,value in enumerate(matrix):
        if match[0] in value:
            value.extend(match[1:])

print(matrix)

输出:

[['#123', '#111', '#222', '#333'], ['#234'], ['#345'], ['#666']]

编辑:

正如你所说,你想限制只搜索 num 然后你可以在上面的代码之前添加一些逻辑,这里是更新的代码:

import re
pattern=r'#\d+'
num = '#123'

line = '#123 random text generator #111 #222 #333'

matrix = [['#123'],['#234'],['#345'],['#666']]
if len(line.split()[0])==len(num):
    if line.startswith(num):
        match=re.findall(pattern,line)
        for index,value in enumerate(matrix):
            if match[0] in value:
                value.extend(match[1:])

print(matrix)

测试用例 1:

line = '#1234 random text generator #111 #222 #333' #not exact string 

输出:

[['#123'], ['#234'], ['#345'], ['#666']] #no effect

测试用例 2:

line = '#1234 random text generator #111 #222 #333' #exact string

输出:

[['#123', '#111', '#222', '#333'], ['#234'], ['#345'], ['#666']]

【讨论】:

  • 这似乎效果更好!当行以“#123”开头时,我仍然遇到逻辑问题,但它是例如“#1231 随机文本生成器#111 #222 #333”。有没有办法“准确”地获取 num 的值?
  • @YafimSimanovsky 令人困惑,你能解释一下你到底在看什么吗?
  • 您的示例似乎在 txt 文件中找到了文本行,但它也找到了任何以相同但不完全匹配开头的行。例如,以#1234 开头的行也将匹配startswith('#123')。有没有办法以某种方式限制它只找到 num 值?
  • @YafimSimanovsky 我已经更新了答案,如果我的解决方案对您有帮助,那么您可以接受答案。
猜你喜欢
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
  • 2014-04-09
  • 2016-05-04
相关资源
最近更新 更多