在python中,我想提取一个特定的子字符串,直到提供输入字。
考虑以下字符串: -
"Name: abc and Age:24"
我想分别提取字符串"Name : abc and"
和"Age:24"
。
我目前正在使用以下模式:
re.search(r'%S+\s*:[\S\s]+',pattern).
但是o / p是整个字符串。
答案 0 :(得分:1)
您可以使用re.findall
:
>>> import re
>>> s="Name: abc and Age:24"
>>> re.findall(r'[A-Za-z]+:[a-z\s]+|[A-Za-z]+:\d+',s)
['Name: abc and ', 'Age:24']
在字符串中的前一个模式中,键(Age
和Name
)以大写字母开头,您可以使用[A-Za-z]+
来匹配它们。它将匹配任何大写和小写的组合len为1或更多的字母,但对于:
之后的其余字符串,您可以使用小写字母,对于第二部分也是相同的。但对于第二部分:
之后的字符串,您只需匹配长度为1或更长的数字!
如果:
之后您可能在第二部分中使用了字符串,则可以使用\w
代替\d
:
>>> re.findall(r'[A-Za-z]+:[a-z\s]+|[A-Za-z]+:\w+',s)
['Name: abc def ghi ', 'Location:Earth']
答案 1 :(得分:0)
您需要使用re.findall
。
>>> s = "Name: abc and Age:24"
>>> re.findall(r'\S+\s*:.*?(?=\s*\S+\s*:|$)', s)
['Name: abc and', 'Age:24']
>>> re.findall(r'[^\s:]+\s*:.*?(?=\s*[^\s:]+\s*:|$)', s)
['Name: abc and', 'Age:24']
[^\s:]+
匹配任何字符,但不匹配:
或空格一次或多次。所以这与关键部分相匹配。\s*:
匹配零个或多个空格和冒号符号。.*?
非贪婪地匹配零个或多个,直到(?=\s*[^\s:]+\s*:|$)
关键部分或行尾。 (?=...)
称为正向前瞻,它断言匹配是否可能。它不匹配任何单个字符。或强>
您可以使用re.split
。
>>> re.split(r'\s+(?=[^\s:]+\s*:)', s)
['Name: abc and', 'Age:24']
答案 2 :(得分:0)
您可以使用此正则表达式:
\w+[:]\w+|\w+[:](\s)\w+|\w+(\s)[:]\w+
以下是细分:
\w+[:]\w+
\ w表示得到一个单词,[:]表示获取冒号字符,+符号表示获取冒号前面的单词。其余部分则相反:)
| symbol只是一个OR运算符,我用它来检查空格是跟随还是在冒号之前。
它会得到冒号之前和之后的单词。它也可以在冒号之前或之后有空格时使用。