re.findall 添加参数re.S报错
时间: 2024-02-01 17:03:10 浏览: 118
使用 `re.S` 参数时,表示 `.` 匹配包括换行符在内的任意字符。如果你在使用 `re.findall` 函数时,添加了 `re.S` 参数,但是正则表达式中没有使用 `.`,那么就会出现报错。
例如,下面的代码会出现报错:
```
import re
text = 'Hello\nWorld\n'
pattern = 'Hello'
result = re.findall(pattern, text, re.S)
```
报错信息为:
```
sre_constants.error: nothing to repeat at position 0
```
这是因为在正则表达式中,`pattern` 中并没有使用 `.`,所以 `re.S` 参数就没有意义了,反而导致了报错。正确的做法是,只在正则表达式中使用 `.`,而不添加 `re.S` 参数:
```
import re
text = 'Hello\nWorld\n'
pattern = 'H.llo'
result = re.findall(pattern, text, re.S)
```
这样就可以正常运行了。
相关问题
link = re.findall(findLink, item)[0]报错
这个错误可能是由于`findall()`方法没有匹配到任何结果,导致返回的是一个空列表,而您又尝试去访问这个空列表的第一个元素,从而导致了IndexError错误。
为了避免这种错误,您可以在使用`findall()`方法之前,先判断一下它是否返回了非空结果,例如:
```python
links = re.findall(findLink, item)
if links:
link = links[0]
else:
link = ''
```
在上面的代码中,我们先使用`findall()`方法获取匹配的结果,如果`links`非空,则取第一个元素赋值给`link`,否则将`link`赋值为空字符串`''`。
这样做可以避免IndexError错误,同时也可以处理`findall()`方法找不到匹配结果的情况。
def detail(name, companyName, workingExp, number, type): detailUrl = f'https://xiaoyuan.zhaopin.com/job/{number}?jobSourceType={type}&jobfrom=practicesearch&productId=1&channelId=2' res = requests.get(detailUrl, headers=headers) # print(res.text) result = re.findall(r'<div class="describe">(.*?)</div>', res.text, re.S) # print(result) if result: content = result[0].replace('<br>', '') zhice = re.findall(r'职责(.*?)。', content) zige = re.findall(r'任职(.*?)。', content) zhice = ''.join(zhice) zige = ''.join(zige) writer.writerow([name, companyName, workingExp, zhice, zige,content]) print('已存入') else: writer.writerow([name, companyName, workingExp,result]) print('报错!!')
这段代码是一个函数,接受五个参数,分别是职位名称(name)、公司名称(companyName)、工作经验(workingExp)、职位编号(number)和职位类型(type)。它的功能是从智联招聘的网页中爬取职位的详细信息,包括职责、任职要求和职位描述,并将这些信息写入一个 CSV 文件中。
具体实现方式是通过 requests 库发送 GET 请求,获取职位详情页的 HTML 文本,然后使用正则表达式从中提取出职责(zhice)、任职要求(zige)和职位描述(content),最后将这些信息写入 CSV 文件中。如果提取失败,则只将职位名称、公司名称和工作经验写入 CSV 文件,并输出错误信息。
阅读全文