This topic created in 3077 days ago, the information mentioned may be changed or developed.
有如下两种格式的信息,想提取名称和地址信息:
1、供应商名称:肇 庆市锐装有限公司 2、法人 : 郑均 3、地址: 肇庆市梅庵路
供应商名称:肇 庆市锐装有限公司 法人 : 郑均 地址: 肇庆市梅庵路
如果这样写正则:供应商名称\s*:\s*(.{,30})\s*\d?.*?法人.{,40}?地址:\s*(\S+)
对于第一种格式的结果会是:肇 庆市锐装有限公司 2、
如果 ?能优先从 1 次而非 0 次开始匹配就好了
14 replies • 2017-12-15 17:23:56 +08:00
 |
|
1
mengzhuo Dec 14, 2017 1
不用正则……直接按值分隔,然后按数组取搞定了……
一个问题用正则,现在你有两个问题了
|
 |
|
3
polymerdg Dec 14, 2017
var_dump(explode(':',$str));
|
 |
|
4
geelaw Dec 14, 2017 via iPhone
? 确实是优先匹配 1 而不是 0。只要让 * 优先匹配更少的次数即可,方法是把 * 换为 *?
|
 |
|
5
vincenttone Dec 14, 2017
/名称:(.+?) .*地址:(.*)/ 如果 “肇 庆市锐装有限公司” 里面没有空格的话
|
 |
|
6
ffkjjj Dec 14, 2017
String regex = "供应商名称\\s*:\\s*(.{0,30}\\D)(\\s2?)\\s*\\d?.*?法人.{0,40}?地址:\\s*(\\S+) ";
|
 |
|
7
ffkjjj Dec 14, 2017
也可以这样, tring regex = "供应商名称\\s*:\\s*(.{0,30}\\s)(2?)\\s*\\d?.*?法人.{0,40}?地址:\\s*(\\S+) "; 给 .{0,30} 一个 2 之前的结束标志就好了,就可以将 “肇 庆市锐装有限公司” 放在一个组里面。
|
 |
|
9
wellCh4n Dec 14, 2017
我觉得 先用正则 \d*、把序列编号用空格代替了之后用:和空格 kv 分割 比较方便啊。。
|
 |
|
10
laqow Dec 14, 2017 via Android
把空格标点数字全删了按几个标题字符断一下
|
 |
|
11
taofuan Dec 14, 2017
得用环视吧 (?<=供应商名称:).+(?=2、)|(?<=2、).+(?=3、)|(?<=3、地址:).+
|
 |
|
12
taofuan Dec 14, 2017
改一下 (?<=供应商名称:).+(?=2、)|(?<=2、法人 :).+(?=3、)|(?<=3、地址:).+
|
 |
|
13
yucongo Dec 14, 2017
In [25]: s1 = '1、供应商名称:肇 庆市锐装有限公司 2、法人 : 郑均 3、地址: 肇庆市梅庵路 '
In [26]: s2 = '供应商名称:肇 庆市锐装有限公司 法人 : 郑均 地址: 肇庆市梅庵路'
In [27]: pat = re.compile(r'(?:\d、)?供应商名称:(\D+)(?:\d、)?法人 :.+地址:(.+)$')
In [28]: pat.search(s1).groups() Out[28]: ('肇 庆市锐装有限公司 ', ' 肇庆市梅庵路 ')
In [29]: pat.search(s2).groups() Out[29]: ('肇 庆市锐装有限公司 ', ' 肇庆市梅庵路')
|
 |
|
14
cnaol Dec 15, 2017
> import re s1 = '1、供应商名称:肇 庆市锐装有限公司 2、法人 : 郑均 3、地址: 肇庆市梅庵路 ' s2 = '供应商名称:肇 庆市锐装有限公司 法人 : 郑均 地址: 肇庆市梅庵路 '
recom = re.compile(r'(?<=供应商名称:)(?P<company>[^ ]* ?[^ ]*).*(?<=法人 : )(?P<owner>[^ ]*).*(?<=地址: )(?P<addr>[^ ]*).*') print(recom.findall(s1)) print(recom.findall(s2))
############## [('肇 庆市锐装有限公司', '郑均', '肇庆市梅庵路')] [('肇 庆市锐装有限公司', '郑均', '肇庆市梅庵路')]
|