【发布时间】:2020-05-26 17:59:45
【问题描述】:
一般目的是在出现连字符或斜杠时将字符串分成两部分。但是,断开字符串取决于在斜杠或连字符之前有任何键值。否则,字符串保持原样。
例如,键值由以下内容组成:
limitee,corp.,ltee.,co-operative,co-op,ltd.,corp,ltee,coop,ltd,co
那么断字符串的结构应该是:
"ABC KINDER LTD./ KINDER ABC LTEE." --> Did not get correct with current regex
The string is broken in two because ltd. is before slash as a result "ABC KINDER LTD." is kept.
"ABC KINDER LTD/KINDER ABC LTEE." --> Did not get correct with current regex
The string is broken in two because ltd. is before slash as a result "ABC KINDER LTD" is kept.
"ABC BOOKS OF THE WORLD CORP.-LA COMPAGNIE DES LIVRES DU MONDE" --> Got correct this one in regex
The string is broken because of corp. is before hyphen. The final string is "ABC BOOKS OF THE WORLD CORP."
"ABC CO-OP DISTRICT SCHOOLS/ SCOLAIRES DISTRICTS ABC COOP" --> Did not get correct with current regex
The string "ABC CO-OP DISTRICT SCHOOLS" is kept.
"ABC PRE/SCHOOL DISRICTS" is NOT modified because it does not have any of the keywords before the slash.
This case is working as expected with the current regex.
一般规则是在斜线或连字符之前使用任何关键字来分隔。否则,字符串将保持原始形式。附带说明一下,斜线或连字符后的关键字不会影响结果。
我已尝试使用以下正则表达式:
^(.*(?<!\w)(?:limitee|corp\.|ltee\.|co\-op|ltd\.|corp|ltee|coop|ltd)(?![A-Za-z0-9_\/])[A-Za-z0-9.,&]*?)+(?:[-/](\s*.*))?$
但是,我只是正确地获取了字符串的第一部分:
ABC BOOKS OF WORLD CORP./LA COMPAGNIE DES LIVRES DU MONDE
基本上,因为第二部分中没有关键字,所以我能够正确地获取该字符串。但是,在字符串的第二部分有关键字时我遇到了麻烦(使用前面的正则表达式,第二部分被放在第一组中并保留整个字符串)。
即使第二部分中有关键字(在连字符或斜杠之后),我如何才能获取字符串的第一部分?
更新: 我摆脱了第二组的可选。现在它是强制性的,这个改变得到了正确的结果,但不确定它是否有效:
^(.*(?<!\w)(?:limitee|corp\.|ltee\.|co\-op|ltd\.|corp|ltee|coop|ltd)(?!\w)?[A-Za-z0-9.,& ]*?)(?:[-/](\s*\w+.*))
但是,这是不正确的,因为如果我们在关键字中有一个子字符串,那么它将不起作用。例如,如果将co 添加到关键字列表(co-op 的子字符串)中,那么ABC CO-OP DISTRICT SCHOOLS 和ABC CO-OPERATIVE DISTRICT SCHOOLS 将被转换为ABC CO,这是不正确的。
谢谢:)
【问题讨论】:
-
你想要
^([^-/\n]*\b(?:limitee\b|corp\b\.?|ltee\b\.?|co-?op|ltd\b\.?)[^-/\n]*)(?:[-/]\s*(.*))?$吗?见regex101.com/r/nmq1mU/1 -
感谢@WiktorStribiżew,我在更新中包含的问题是,如果在关键字中我有一个子字符串,那么只是在交替中采用最小的字符串。例如,如果将
co添加到关键字中,则ABC CO-OP DISTRICT SCHOOLS将变为ABC CO。我怎么能对正则表达式说,只需按照交流发电机中显示的顺序搜索字符串,不要继续搜索。然后,当找到co-op时,引擎不会继续检查co -
您的意思是您正在动态构建正则表达式?使用
r'^([^-/]*\b(?:{})(?!\w)[^-/\n]*)(?:[-/]\s*(.*))?$'.format('|'.join(sorted(map(re.escape(terms), key=len, reverse=True)))) -
是的,我正在动态传递关键字,并将关键字作为参数传递给函数。基本上,以您建议的相同方式:
all_terms.sort(key=len, reverse=True); term_alternators = '|'.join(map(re.escape, all_terms))。然后在正则表达式中使用term_alternators。它们按顺序传递,但不知道为什么ABC CO-OP DISTRICT SCHOOLS字符串与term_alternators如CO-OPERATIVE|CO-OP|CO.|CO作为参数会首先找到CO并在那里制动第一部分。 -
你需要让第一个
[^-/]*变得懒惰,[^-/]*?:r'^([^-/]*?\b({})(?!\w)[^-/\n]*)(?:[-/]\s*(.*))?$'.format('|'.join(sorted(map(re.escape(terms), key=len, reverse=True))))