Python re.search()始终不返回任何值,并且可以';找不到错误

Python re.search()始终不返回任何值,并且可以';找不到错误,python,regex,Python,Regex,我正在用西班牙语编写一个法律文件自动阅读器。谢谢你 通过拉网,我得到以下字符串: “DECAD-2021-368-APN-JGM-设计主管数据库 y Escaluación de la Gestión.' 我用type()检查了一下,它是一个字符串,unicode(我不可能以其他方式理解) 问题是我一直在运行这个re.search(),这将允许我或不允许我继续其他进程,并且一直不返回任何结果,我不明白我做错了什么。我也尝试了使用和不使用re.UNICODE标志 if re.search(

我正在用西班牙语编写一个法律文件自动阅读器。谢谢你

通过拉网,我得到以下字符串:

“DECAD-2021-368-APN-JGM-设计主管数据库 y Escaluación de la Gestión.'

我用type()检查了一下,它是一个字符串,unicode(我不可能以其他方式理解)

问题是我一直在运行这个re.search(),这将允许我或不允许我继续其他进程,并且一直不返回任何结果,我不明白我做错了什么。我也尝试了使用和不使用re.UNICODE标志

    if re.search(r"( Dase por designad[o]?[a]?)",str(b),re.UNICODE) != None:
    return "I'm gonna read it"
else:
    return "I'm not gonna read it"
注:[o]?[a]?当文本提到男性或女性官僚时,是匹配的

我尝试了不同版本的正则表达式:

"( Dase por designad[o]?[a]?)" without r before string.
"( Dase por designad)"
"Dase por designad"
我为此项目做了很多re.search()操作,但由于某种原因,我一直坚持着这个

我想这一定是个简单的问题,我就是看不出来。 谢谢大家的帮助

回答和添加请求的信息: 我正在用Spyder 5编写和测试这篇文章,它在Anaconda上运行,在Windows 10上运行。Python 3.7.10

Blacknight:我检查了字符串的硬编码,它可以工作。问题是,当字符串来自以下项的返回时,它不会:

link = "/detalleAviso/primera/243131/20210419"  
url = f"https://www.boletinoficial.gob.ar{link}"
req = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})
    
    
soup = BeautifulSoup(req.content, 'html.parser')
    
a =soup.find(id="tituloDetalleAviso")

b = a.find('h6').text
b = str(b)
若我在控制台中得到打印b,将粘贴复制到硬代码并重新运行,我会得到一个匹配项。但当它来自网络垃圾的时候,它就不存在了

我只是运行b==c:并返回False,其中b是从webscraping返回的,c是该webscrape上次运行的打印


我尝试了str(b),但不起作用。

使用difflib来比较键入和刮取的原始字符串,它突出显示了空格之间的某种差异

将正则表达式更改为识别任何空格字符而不是仅识别“”似乎已经修复了它。新的正则表达式是:

r"(\s*Dase\s*por\s*designad[o]?[a]?)"

由于某些原因,保留单个\s无法修复此问题,必须将其设置为多个,才能进行可能的匹配。作为快速修复,我使用的是0到无限,你可能想考虑改变它。

< P>已提供的已接受答案,直接回答问题。但你真正想问的是“当这种情况发生时,我如何调试它?”

首先,注意详细说明您的需求。如果有人在6个月内给出了这个答案,你的导入是否有效

我在一个virtualenv中安装了bs4请求
pip,然后
pip冻结
,我得到了以下结果:

$ python -V
Python 3.8.7
$ pip freeze
beautifulsoup4==4.9.3
bs4==0.0.1
certifi==2020.12.5
chardet==4.0.0
idna==2.10
requests==2.25.1
soupsieve==2.2.1
urllib3==1.26.4
其次,包括一个完全可运行的示例。包括您的
导入
行,以显示导入的
美化组
请求
等。这为回答者节省了大量时间

第三,您需要保留正在处理的字符串。显然,在您的计算机上,复制/粘贴是在进行某种形式的空白规范化。我不知道为什么,在macOS Big Sur和Emacs上,我可以清楚地看到复制/粘贴的字符串中有时髦的空格:

考虑到这一点,您需要执行以下操作:

import base64

print(base64.b64encode(b.encode("utf-8")))
print(b)
b'REVDQUQtMjAyMS0zNjgtQVBOLUpHTSAtIERhc2UgcG9ywqBkZXNpZ25hZGEgRGlyZWN0b3JhIGRlwqBTZWd1aW1pZW50byB5wqBFdmFsdWFjacOzbiBkZcKgbGHCoEdlc3Rpw7NuLg=='
这种ASCII保护字符串值,使其可以逐位精确地重建,而无需依赖操作系统剪贴板使其保持完好无损。您将得到如下值:

import base64

print(base64.b64encode(b.encode("utf-8")))
print(b)
b'REVDQUQtMjAyMS0zNjgtQVBOLUpHTSAtIERhc2UgcG9ywqBkZXNpZ25hZGEgRGlyZWN0b3JhIGRlwqBTZWd1aW1pZW50byB5wqBFdmFsdWFjacOzbiBkZcKgbGHCoEdlc3Rpw7NuLg=='
然后,您可以使用
base64.b64解码(…).decode(“utf-8”)
将其加载回,以确保人们可以看到完全相同的内容,即使被刮取的网页发生了更改

最后,您可能希望自己调查字符串,以准确了解这些不可见字符是什么。这里有一个快速的程序,可以让您使用内置的
unicodedata
模块很好地了解字符串中的不可见项、控制字符、空白等的情况:

import unicodedata

for character in text:
    print(repr(character), "-", unicodedata.name(character))
字符串的输出片段显示:

'p' - LATIN SMALL LETTER P
'o' - LATIN SMALL LETTER O
'r' - LATIN SMALL LETTER R
'\xa0' - NO-BREAK SPACE
'd' - LATIN SMALL LETTER D
'e' - LATIN SMALL LETTER E
's' - LATIN SMALL LETTER S

因此,您可以看到所有时髦的空格都不是间断空格。

您能给出一个正则表达式不起作用的示例字符串吗?因为对于你提供的信息,我无法重现你报告的问题。如果我做了
b='DECAD-2021-368-APN-JGM-Dase por designida Directora de Seguimiento y evalución de la Gestión.
,您的正则表达式会找到匹配项。在给定的示例中进行测试时,它似乎与我在Linux上用Python 2.7.18和3.8.5测试您的代码片段的模式一致,这对我来说是有效的。请就您的问题添加更多详细信息,例如Python版本、操作系统和更多与如何将此值分配给
b
相关的代码片段。此外,您还可以将
[o]?[a]?
简化为
[oa]?
,并得到相同的结果。如果您不能以一种让我们重现问题的方式向我们展示不匹配的问题样本,我们就无法找出它不匹配的原因。另请参见使用difflib将原始字符串与替换字符串进行比较,它似乎发现空格之间存在差异,可能它们是不同的空白字符?