Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试在Python中搜索带(.*)的字符串_Python_Regex_Findall - Fatal编程技术网

尝试在Python中搜索带(.*)的字符串

尝试在Python中搜索带(.*)的字符串,python,regex,findall,Python,Regex,Findall,我刚接触Python 3天,我正在尝试使用findall()搜索指定格式后的字符串 >>> nameRegex = re.compile(r'First Name: (.*?) Last Name: (.*?)') >>> nameRegex.findall('This is my application for the job. First Name: John Last Name: Johnson DOB 01/01/90'

我刚接触Python 3天,我正在尝试使用findall()搜索指定格式后的字符串

    >>> nameRegex = re.compile(r'First Name: (.*?) Last Name: (.*?)')
    >>> nameRegex.findall('This is my application for the job. First Name: 
       John Last Name: Johnson DOB 01/01/90')
    >>> [('John', '')]

我意识到我在用非贪婪的?在组中,因为否则它也将返回字符串的DOB部分

是否有一种方法可以格式化Johnson字符串部分,而不做更多

因为我是一个新手,所以我不知道该朝哪个方向移动才能得到想要的那部分线


提前感谢所有人。

将正则表达式更改为

nameRegex = re.compile(r'First Name: (\w*) Last Name: (\w*)')
这使得它将所有Unicode单词字符与不包含空格的
\w
匹配。或者,您可以使用
\S
而不是
\w
来匹配所有非空白字符。有关这些特殊转义序列的参考,请参阅

然后输出为

[('John', 'Johnson')]

最后用空格锚定正则表达式模式。这将有助于您捕获
姓氏:
之后直到下一个空格的所有内容

>>> nameRegex = re.compile(r'First Name: (.*?) Last Name: (.*?) ')
>>> nameRegex.findall('This is my application for the job. First Name: John Last Name: Johnson DOB 01/01/90')
[('John', 'Johnson')]

另一种方法是只使用非空白构造来获取名称

First\s+Name\s*:\s*(\s*)\s+Last\s+Name\s*:\s*(\s*)


这个问题已经针对单个单词的姓氏和名字得到了回答,但如果事情变得奇怪,它们就不起作用了。以下是处理各种名称的方法(除了包含
“姓氏:”
的名字和包含
“DOB”
的姓氏):

这将提供正确的输出:

[('Mary Beth', "von Sternberg-O'Leary")]
正则表达式中看起来很有趣的位,
(.*?(?=DOB))
,称为“正向前瞻”。简单地说,这使组匹配与
(.*DOB)
相同的字符串,但从捕获组中丢弃
“DOB”


,一旦你熟悉了它们,它们会非常有用。

@Thefourthbird为什么
$
?@Thefourthbird然后它也会捕获DOB部分,正如OP所说的那样…我假设
部分使用点星后会捕获整个DOB部分。如果只是名字,那当然会超过它。If将删除评论。太棒了,效果非常好。空白锚是如何工作的?
*?
是非贪婪的,可以匹配空字符串
'
。但是通过用一个空格来锚定它,你说比赛结束后必须有一个空格。因此,满足这个标准的最小匹配是将所有内容匹配到下一个空间,这是有意义的。非常感谢。我没有想到只使用\w*,因为我只是想找一个词,谢谢。这个主意很好,但最好使用一个非贪婪的量词作为姓氏,以确保在行中的第一个“DOB”处停止,并在“DOB”后添加一个空格(用于John DOBSON)。你也可以这样做。
((?:(?!DOB)。+)
(一个接一个但贪婪)。@casimimirithippolyte-Ooo,抓得好!另外,这是一个有趣的选择。我总是忘记非捕获组。
[('Mary Beth', "von Sternberg-O'Leary")]