在字符串中找到一个出现在单词前面的子字符串

2024-04-18 05:23:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串:

"abc mysql 23 rufos kanso engineer"

我希望regex在单词“engineer”之前输出字符串,直到它看到一个数字。你知道吗

这是正则表达式应该输出的:

23 rufos kanso

另一个例子:

字符串:

def grusol defno 1635 minos kalopo, ruso engineer okas puno"

我希望regex在单词“engineer”之前输出字符串,直到它看到一个数字。你知道吗

这是正则表达式应该输出的:

1635 minos kalopo, ruso

我可以通过一系列正则表达式来实现这一点。你知道吗

我能一枪就搞定吗?你知道吗

谢谢


Tags: 字符串defmysql数字单词例子regexabc
3条回答

我将使用的模式:((\d+)(?!.*\d).*)engineer它查找最新的数字并从那里开始。你知道吗

类似于(\d.*)engineer的东西也可以工作,但前提是字符串中只有一个数字。你知道吗


>>> import re
>>> string = '123 abc mysql 23 rufos kanso engineer'
>>> pattern = r'((\d+)(?!.*\d).*)engineer'
>>> re.search(pattern, string).group(1)
'23 rufos kanso '
>>>

编辑

如果“工程师”部分后面有数字,上面提到的模式不起作用,正如您在注释中指出的那样。我试图解决它,但老实说,我不能想出一个新的模式(对不起)。你知道吗

我可以建议的解决方法是,假设“engineer”仍然是“关键字”,用所说的单词拆分您的初始字符串。你知道吗

我的意思是:

>>> string = '123 abc mysql 23 rufos kanso engineer 1234 b65 de'
>>> string.split('engineer')
['123 abc mysql 23 rufos kanso ', ' 1234 b65 de']
>>> string.split('engineer')[0] 
'123 abc mysql 23 rufos kanso '

# hence, there would be no unexpected digits

>>> s = string.split('engineer')[0]
>>> pattern = r'((\d+)(?!.*\d).*)'
>>> re.search(pattern, s).group(1)
'23 rufos kanso '

看看这个site。玩regex很好,它解释了每个步骤。
这里有一个解决你问题的方法:link

使用^{}进行匹配,直到单词engineer前面有一个数字。你知道吗

^{}-(?=\d)(.+)(?=engineer)

只是想知道:

import re
pattern = r"(?=\d)(.+)(?=engineer)"
input = [ "\"def grusol defno 1635 minos kalopo, ruso engineer okas puno\"", "\"abc mysql 23 rufos kanso engineer\"" ]

matches = []

for item in input:
    matches.append(re.findall(pattern, item))

输出:

[['1635 minos kalopo, ruso '], ['23 rufos kanso ']]

相关问题 更多 >