如何在python中指定正则表达式字符串

时间:2014-02-10 13:21:17

标签: python regex

我有以下两串火车站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)

但结果不断返回String A中的匹配项。 我是否知道如何指定' searchStr '以便仅匹配字符串B?

2 个答案:

答案 0 :(得分:0)

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

标记化

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

但如果你真的需要表现,我相信有更快的方法。即使是标记化方法也会进行多次传递。

答案 1 :(得分:0)

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

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

字面意思是:

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

  4. 教育读者我使用过的内容:

    (?=) 是一个积极的前瞻。

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

    (?!) 是否定前瞻

    • 无论您在此令牌中放置什么,正如您可能猜到的那样,匹配不能为True
    • 我在这里放了一个数字,所以像NS10或NS11或NS19这样的东西永远不会匹配。