我有以下两串火车站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?
答案 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)
作为标记化的替代方法,您可以使用以下表达式。
字面意思是:
教育读者我使用过的内容:
(?=)
是一个积极的前瞻。
True
的内容。 .*?
量词放置?
以匹配任何内容,尽可能少,然后使用NS1,因为这是我们想要找到的内容。 (?!)
是否定前瞻
True
。