正则大神,一个正则问题

2015-06-16 18:34:29 +08:00
 1oscar

字符串1: Tyrsovo Nám., 252 63 布拉格, 捷克共和国
字符串2: Via Augusta 127, 8006 巴塞罗那, 西班牙
字符串3: Victoria Regina Square 11-12, 1210 布鲁塞尔 - Botanique, 比利时

希望得出各个字符串的城市名,比如字符串1是,布拉格,字符串2是, 巴塞罗那,字符串3是布鲁塞尔等等

后面的字符串可能还会更加的不规则,但是唯一的规律就是都有两处中文,城市与国家,要求取出城市名

求指导

5088 次点击
所在节点    Python
24 条回复
oott123
2015-06-16 18:45:04 +08:00
难道不是用逗号切开然后匹配中文就行了么……
iyangyuan
2015-06-16 18:50:04 +08:00
.*([\u2E80-\uFE4F]+).*,.*[\u2E80-\uFE4F]+.*
手机打的,没测,仅供参考
chopper
2015-06-16 18:54:18 +08:00
中文 233333,不知道ascii对应值,随便找了个
[\u4e00-\u9fa5]+(?=.*,)
funagi
2015-06-16 19:05:24 +08:00
```
Python 2.7.6 (default, Mar 22 2014, 22:59:38)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> s = u'''Tyrsovo Nám., 252 63 布拉格, 捷克共和国
... Via Augusta 127, 8006 巴塞罗那, 西班牙
... Victoria Regina Square 11-12, 1210 布鲁塞尔 - Botanique, 比利时'''
>>> p = re.compile(u'([\u2E80-\u9FFF]+)')
>>> for line in s.split('\n'):
... m = p.search(line)
... if m:
... print(m.group(1))
...
布拉格
巴塞罗那
布鲁塞尔
>>>
```
lilydjwg
2015-06-16 19:14:35 +08:00
你们这些用正则的都不知道有个东西叫 \p{Han} 么。当然,PCRE 和 Python 的 regex 第三方库才支持。
Biwood
2015-06-16 19:17:48 +08:00
第一部 /\d\s.*(?=,\s)/,去除数字+空格开头,,以逗号结尾的部分;
第二部[\u4e00-\u9fa5],取出中文;

应该有办法一步完成的,我再研究研究
Biwood
2015-06-16 19:18:37 +08:00
打错字了,两步都是“取出”
heiybb
2015-06-16 19:30:36 +08:00
picasso250
2015-06-16 19:53:45 +08:00
[^,]+,[\d ]+([^,]+)

解释:
匹配第一个逗号之前的内容.
匹配数字
匹配城市名
Septembers
2015-06-16 20:27:23 +08:00
这是CSV格式啊
keepsome
2015-06-16 20:32:52 +08:00
适用于一行仅两段中文
[^\x{4e00}-\x{9fa5}]+([\x{4e00}-\x{9fa5}]+)[^\x{4e00}-\x{9fa5}]+[\x{4e00}-\x{9fa5}]+\s+
全部替换成$1
最后一行加个换行或者手动提取就行
notepad++实测成功
msg7086
2015-06-16 20:33:02 +08:00
@Septembers 并不是吧。
keepsome
2015-06-16 20:36:24 +08:00
[^\x{4e00}-\x{9fa5}]+([\x{4e00}-\x{9fa5}]+)[^\x{4e00}-\x{9fa5}]+[\x{4e00}-\x{9fa5}]+.*\s+
修订版,为了防止后一段中文之后还有字符
其他一致,全部替换成$1
最后一行加个换行或者手动提取
1oscar
2015-06-16 22:12:46 +08:00
@funagi Thank you!
ElvisZhu
2015-06-16 22:37:49 +08:00
^[^,]+,[ 0-9]*([^0-9 ,]+).*
取\1
leavic
2015-06-17 00:35:06 +08:00
先用逗号split一下吧,中文我还真不知道怎么搞,得查unicode代码
tntasdf
2015-06-17 09:08:18 +08:00
// PHP

$str="Tyrsovo Nám., 252 63 布拉格, 捷克共和国
Via Augusta 127, 8006 巴塞罗那, 西班牙
Victoria Regina Square 11-12, 1210 布鲁塞尔 - Botanique, 比利时";

preg_match_all('/([^\x00-\x80]+?)(,|\s-)/',$str,$mts); // 更不规则的,改括号2的正则

print_r($mts); // $mts[1] 就是了


事实上不需要拘泥于一个正则搞定,可以先做字符串处理。正则规则写得越复杂,效率越慢。
tntasdf
2015-06-17 09:25:26 +08:00
写的是php , python不懂多少 。 主要看正则,大致是可以移植的。PHP中需要[^\x00-\x80]来匹配中文,python的话应该是其他, 另外就是非贪婪模式了。
dallaslu
2015-06-17 09:28:42 +08:00
,[\d\s]+(.*?)[,\s]
dallaslu
2015-06-17 09:29:43 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/199054

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX