【问题标题】:Python: How do I continue searching a list for different elements efficiently?Python:如何有效地继续搜索不同元素的列表?
【发布时间】:2016-11-17 15:16:00
【问题描述】:

我有很多我已经抓取和解析的字符串列表,我想使用正则表达式在这些列表中找到某些字符串。我想要的每个字符串都是不同的,但它们按顺序出现在列表中。 IE。我想要的第一个字符串总是出现在第二个字符串之前,第二个字符串会出现在第三个字符串之前,依此类推。但是,我不能只使用索引,因为列表之间的元素数量因列表而异。

例如。假设我抓取了这些字符串并将其存储在以下列表中:

personal_info = ["Name: John Doe", "Wife: Jane Doe", "Children: Jenny Doe", "Children: Johnny Doe", "Location: US", "Accounts: BoA", "Accounts: Chase", "House: Own", "Car: Own", "Other: None"]

personal_info2 = ["Name: James Lee", "Location: CAN", "Accounts: Citibank", "House: Rent", "Car: Own", "Other: None"]

我想抓取以名称、位置和房屋开头的元素,它们之间可能有也可能没有多个元素。 Location 将始终在 Name 之后,House 将始终在 Location 之后。

因为我将在许多列表中重复此操作,我想使用第一个正则表达式进行搜索,然后从我离开的地方继续使用下一个正则表达式进行搜索,因为我知道它们是按顺序出现的。在 Python 中是否有一种简洁的方法可以做到这一点? 目前我有一组 for 循环,当有匹配时中断,然后记录索引以传递给下一个 for 循环。

如果必须显示:

idx = 0 for string in string_list: idx +=1 if re.search('pattern', string) is not None: string_one = re.search('pattern', string).group(0)

【问题讨论】:

  • 如何将数据抓取到字典而不是列表中,这样您就可以使用O(1) 查找而不是O(n)
  • 我目前有一组 for 循环,匹配时中断 - 显示该代码怎么样?
  • 您可以在正则表达式中使用组,并将连续元素与连续组匹配。如果你想要一个使用它的例子,你可以在这里查看:csv.py in the function _guess_quote_and_delimiter l.205
  • @DeepSpace 好主意,但我给出的示例的动机是从网站上抓取文本行,这些文本在解析之前自动存储在列表中。在我什至可以将它们存储在任何地方之前,我必须通过这些列表进行正则表达式搜索以获取我想要的信息。
  • @RomanPerekhrest 如果必须显示,我已经在上面添加了。

标签: python regex list loops pointers


【解决方案1】:

打印您请求的字段的短代码:

x=["Name", "Location", "House"]
y=iter(x)
z=y.next()
for a in personal_info:
    if a.startswith(z):
        print a
        try:
            z=y.next()
        except StopIteration:
            break

您可以将“startswith”替换为正则表达式,并将“print”替换为任何其他操作。

【讨论】:

    【解决方案2】:

    您也可以使用索引计数器来跟踪您要检查的条件:

    conditions = [("Name", "John Doe"), ("Location", "US")]
    condition_index = 0
    
    for index, i in enumerate(personal_info):
        j1, j2 = conditions[condition_index]
        if j1 in i or j2 in i:
            print "List idx", index, i, "Condition", (j1, j2)
            condition_index += 1
            if condition_index == len(conditions):
                break
    
    >>>List idx 0 Name: John Doe Condition ('Name', 'John Doe')
    List idx 4 Location: US Condition ('Location', 'US')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 2023-01-04
      • 1970-01-01
      • 2020-06-16
      相关资源
      最近更新 更多