正则表达式以匹配在另一个字符之前或之后或两者都匹配的字符,但两者都不匹配

时间:2019-04-21 18:30:06

标签: python regex

我要匹配连字符,如果在连字符前面或后面有空格,或者两者都有,但不是独立的连字符。尽管有多个管道可以解决此问题(类似于已经提出但又不相同的问题),但我想知道是否存在直接解决方案。

例如。我想匹配(假设.是用于格式化的空间).-..--.,而不仅仅是-

当前表达式:

/ *- */g

匹配所有这些。

除了连字符之前或之后的至少一个空格中,是否有一种方法可以使总数达到1个或更多?

编辑:更多上下文

我正在处理多个表达式:

aln = re.compile(r'[^ \-a-zA-Z0-9]+')  # matches non space or - or alphanumeric characters
spc = re.compile(' +')  # matches one or more spaces

url_data = song + '-' + artist
url_data = re.sub(aln, '', url_data)  # remove punctuation and other characters
url_data = re.sub(spc, '-', url_data)  # substitute one or more spaces to -

例如。如果歌曲是ABC, XYZ而歌手是PQR,那么最后我会得到PQR-ABC-XYZ

但是,如果歌曲的形式为, ABC ,和歌手为PQR,则我想获得PQR--ABC-时得到PQR-ABC

如果我将spc更新为*- *| +,则在正常情况下(第一个示例),它将多余地匹配连字符,并仅用我要改进的连字符替换它。

1 个答案:

答案 0 :(得分:0)

Eg. I want to match (assume . to be a space for formatting) .-. or .- or -. but not just -

对于一个条件使用断言,然后对其余条件使用非断言模板。
这样,您在这种情况下就不需要更改。

对于您的 dot 类推,就是这样
(?=[.-]*\.)\.*-\.*

https://regex101.com/r/ivtl8z/1

用空格代替点,就产生了这个(为视觉效果在类中加了空格)
(?=[ -]*[ ])[ ]*-[ ]*

否则(以字符串形式)

regex = '(?=[ -]* ) *- *'