【问题标题】:How to specify the regex string in python如何在python中指定正则表达式字符串
【发布时间】:2014-02-10 13:21:17
【问题描述】:

我有以下 2 串火车站 ID(显示行进方向),用“-”分隔。

String A (strA):
NS1-NS2-NS3-NS4-NS5-NS7-NS8-NS9-NS10-NS11-NS13-NS14-NS15-NS16-NS17-NS18-NS19-NS20-NS21-NS22-NS23-NS24-NS25-NS26-NS27

String B (strB):
NS27-NS26-NS25-NS24-NS23-NS22-NS21-NS20-NS19-NS18-NS17-NS16-NS15-NS14-NS13-NS11-NS10-NS9-NS8-NS7-NS5-NS4-NS3-NS2-NS1

我想找出字符串 A 或 B 中的哪一个包含电台“NS4”,然后是“NS1”(答案应该是字符串 B)。 我目前的代码如下:

searchStr = ".*NS4-.*NS1(-.*|)"
re.search(searchStr, strA)
re.search(searchStr, strB)

但结果一直在字符串 A 中返回匹配项。 我可以知道如何指定 'searchStr' 以仅匹配字符串 B 吗?

【问题讨论】:

  • 正则表达式不是适合这项工作的工具
  • "NS4-NS10" 将匹配您的正则表达式。
  • 嗨 Jarrod,我应该将其标记为搜索列表吗?
  • 为什么投反对票?这个问题对我来说似乎很清楚。使用NS4-.*NS1($|-) 作为正则表达式。应该工作。
  • 我正要回答这个问题,使用这个正则表达式:NS4(?=.*?NS1(?!\d)) 它说 NS1 必须跟随 NS4,但数字不能跟随 NS1。它会起作用的。

标签: python regex


【解决方案1】:

两种方法:标记化和改进正则表达式。

标记化

tokA = strA.split('-')
tokB = strB.split('-')

print('NS4' in tokA and tokA.index('NS1') > tokA.index('NS4'))
print('NS4' in tokB and tokB.index('NS1') > tokB.index('NS4'))

# False
# True

正则表达式

import re
pattern = '(^|-)NS4.+NS1(-|$)'
print(re.search(pattern, strA) is not None)
print(re.search(pattern, strB) is not None)

# False
# True

性能

Tokenization: 2.3072939129997394
Regex: 11.138173280000046

但如果您真的需要性能,我相信有更快的方法。甚至标记化方法也会多次传递。

【讨论】:

    【解决方案2】:

    作为标记化的替代方法,您可以使用以下表达式。

    NS4(?=.*?NS1(?!\d))

    字面意思是:

    1. 字面意思是“NS4”。
    2. 后跟任何字符,直到找到 NS1。
    3. NS1 后面不能跟数字。

    为了让读者了解我使用过的东西:

    (?=) 是正向预测。

    • 必须找到您在此令牌中放置的任何内容,匹配为True
    • 我放置 .*? 以匹配任何内容,尽可能少使用 ? 量词,然后是 NS1,因为这是我们想要找到的。

    (?!) 是负前瞻

    • 您可能会猜到,无论您在此令牌中放置什么,都不能找到匹配的 True
    • 我在这里放了一个数字,这样 NS10 或 NS11 或 NS19 之类的东西永远不会匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 2012-05-28
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多