我有以下字符串
s1 = 'XXX-2 I LOVE : XXX XXX'
s2 = 'FOOD : XXX'
s3 = 'XXX-FOOD : XXX
我想要以下
s1 = '2 I LOVE'
s2 = 'FOOD'
s3 = 'FOOD'
s2
仅具有1个定界符:
,而s1 & s3
具有2个- & :
我想将所有内容都保留在两个定界符- & :
之间,因此我使用以下\-(.*?)\:
,但是我没有得到s2
如果我使用以下\w+\-?(.*?)\:
,我会在-
之前得到一切
我在regex上很糟糕,如果有人可以帮助我解决这个问题并提供了解regex的链接,我将不胜感激。
答案 0 :(得分:1)
以下正则表达式适用于您的示例
(?:[^-]+-)?([^:]+):.*
答案 1 :(得分:1)
我们正在使用strip
删除尾随空格。
s1 = re.sub(r'[^a-zA-Z0-9\s]+|X','',s1).strip()
s2 = re.sub(r'[^a-zA-Z0-9\s]+|X','',s2).strip()
s3 = re.sub(r'[^a-zA-Z0-9\s]+|X','',s3).strip()
2 I LOVE
FOOD
FOOD
答案 2 :(得分:1)
您需要的正则表达式为:(?:\w+-)?(.*?):
(?:\w+-)?
说要检查类似单词的字符\w
的初始序列,然后是连字符。既然我们在括号中有一个问号,它后面的问号表示整个部分都是可选的-即,要么在行的开头出现\w+
和-
,要么都不存在。 ?:
部分只是告诉Python您在这里使用括号()
只是为了进行分组,而不是因为您希望捕获和存储匹配的部分。
(.*?)
-这与我们实际想要的部分匹配,并将其存储在捕获组编号1中。因此,如果您有m = re.match(r"(?:\w+-)?(.*?):", 'XXX-2 I LOVE : XXX XXX')
,则m.group(1)
将包含2 I LOVE
(请注意,一般来说,-
和:
都不需要在正则表达式中使用反斜杠转义(-
仅需在[]
字符类内引用),因此您可以编写他们逃脱而没有逃脱。)
您可能会发现诸如RegExr之类的工具对于探索和理解正则表达式很有用。