lengkeyu 发表于 2022-10-12 09:21

python中正则表达式 的匹配问题,谢谢!

有一个列表文件docname,
里面有如下内容(格式有两种随机情况):
docname=培训教材1.doc
docname*=UTF-8''培训教材2.doc
...

如何用一个re表达式匹配以上两种情况?谢谢
(不想用两个表达式,感觉挺麻烦)
我试了下面的这个
compiler = re.compile(r'docname(\*?)=(UTF-8\'\'?)(.*)')
docname_0 = compiler.search(docname).group(3)
但是只能匹配第二种带*号的情况,与我设想的不同,不明白什么原因,我看正则表达式里面,“?”是匹配0或1次,是理解错误?谢谢!

帅的惊动党 发表于 2022-10-12 09:31

docname.+\.doc

以docname开头、以.doc结尾,中间任意字符至少匹配一次
试试这个?

Sen 发表于 2022-10-12 09:33

str(re.findall("=(.*?).doc", x)).replace("UTF-8'\'", "")

Takitooru 发表于 2022-10-12 09:45

代码

```
import re
str = """docname=培训教材1.doc
         docname*=UTF-8''培训教材2.doc"""

result = re.findall(r'=(.*?).doc', str)
print(result)
```

截图

bobo2017365 发表于 2022-10-12 09:52

compiler = re.compile(r'docname(\*?)=(UTF-8\'\'?)(.*)')
这句正则,是因为匹配多加了一个 (UTF-8\'\'?)(.*),这个的意思是匹配 UTF-8'' 或者 UTF-8''',当然只能匹配第二条,
前面的docname(\*?)正则没毛病
如果你非要这么写,正确的写法:
t1 = "docname=培训教材1.doc"
t2 = "docname*=UTF-8''培训教材2.doc"
for t in :
    print(re.search(r"docname(\*?)=(UTF\-8\'\'|)", t))

你的点Z是我回答的动力

天下客 发表于 2022-10-12 10:10

你的问号应该在第二个小括号外边,这样才表示小括号内的数据出现0次或1次。
你的问号在小括号里边只表示问号前的引号出现0次或1次。

xuanmuluck 发表于 2022-10-12 10:11

本帖最后由 xuanmuluck 于 2022-10-12 10:14 编辑


s1='docname=培训教材1.doc'
s2="docname*=UTF-8''培训教材2.doc"
re.findall("docname\*?=(?:UTF-8\'\')?(.*?)\.doc",s2)
re.findall("docname\*?=(?:UTF-8\'\')?(.*?)\.doc",s1)
基础不扎实,而且你要匹配啥也没说清楚

lengkeyu 发表于 2022-10-12 10:16

bobo2017365 发表于 2022-10-12 09:52
compiler = re.compile(r'docname(\*?)=(UTF-8\'\'?)(.*)')
这句正则,是因为匹配多加了一个 (UTF-8\'\'?) ...

还是要多学习,问题解决了。谢谢。

chinamail 发表于 2022-10-12 10:17

你这理解错了好几处,re.search只匹配一次, \是转义符,\*就是*字符

lengkeyu 发表于 2022-10-12 10:29

xuanmuluck 发表于 2022-10-12 10:11

s1='docname=培训教材1.doc'
s2="docname*=UTF-8''培训教材2.doc"


确实是学的不扎实。
(?:UTF-8\'\')?
这个写法,能给解释下么,谢谢!
页: [1] 2
查看完整版本: python中正则表达式 的匹配问题,谢谢!