正则表达式具有不同的模式

时间:2018-06-21 23:17:22

标签: python regex python-3.x pandas

我有以下字符串

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的链接,我将不胜感激。

3 个答案:

答案 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之类的工具对于探索和理解正则表达式很有用。