Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Regex将城市和州与输入字符串分开_Python_Regex - Fatal编程技术网

Python Regex将城市和州与输入字符串分开

Python Regex将城市和州与输入字符串分开,python,regex,Python,Regex,我有一些输入字符串 Houston, TX (Houston, TX) South & West (Houston, TX) (South & West (Houston, TX)) 我正在使用这个模式,但它不适用于所有四个 .*\(*(.*),\s*(.*)\)* 我只想从上面的输入字符串中得到Houston和TX Houston, TX (Houston, TX) South & West (Houston, TX) (South & West (Hous

我有一些输入字符串

Houston, TX
(Houston, TX)
South & West (Houston, TX)
(South & West (Houston, TX))
我正在使用这个模式,但它不适用于所有四个

.*\(*(.*),\s*(.*)\)*
我只想从上面的输入字符串中得到HoustonTX

Houston, TX
(Houston, TX)
South & West (Houston, TX)
(South & West (Houston, TX))
规则是把括号内的东西拿出来,如果没有括号,就拿出来。结果列表中只有2项

>>> import re
>>> A="Houston, TX (Houston, TX) South & West (Houston, TX) Los Angeles, CA Los Angeles"
>>> re.findall("\w[A-Za-z ]+, [A-Z]{2}",A)
['Houston, TX', 'Houston, TX', 'Houston, TX', 'Los Angeles, CA']
\w
=将匹配以字母表开头的所有名称

[A-Za-z]+
=将所有名称与空格匹配

,[A-Z]{2}
=将匹配所有缩写(两个大写字母)

\w
=将匹配以字母表开头的所有名称

[A-Za-z]+
=将所有名称与空格匹配


,[A-Z]{2}
=将匹配所有缩略语(两个大写字母)

我想我将分两步完成:

in_paren = re.compile(r'(?:\()([^\)\(]+)(?:\))')
match = in_paren.search(ss)
parts = match.group(1) if match else ss
city,state = parts.split(',')
这是一个函数:

>>> def find_city_state(ss):
...     match = in_paren.search(ss)
...     parts = match.group(1) if match else ss
...     return [x.strip() for x in parts.split(',')]
... 
>>> for x in ("Houston, TX","(Houston,TX)","South & West (Houston, TX)","(South & West (Houston, TX))"):
...     print find_city_state(x)
... 
['Houston', 'TX']
['Houston', 'TX']
['Houston', 'TX']
['Houston', 'TX']

我想我可以分两步来做:

in_paren = re.compile(r'(?:\()([^\)\(]+)(?:\))')
match = in_paren.search(ss)
parts = match.group(1) if match else ss
city,state = parts.split(',')
这是一个函数:

>>> def find_city_state(ss):
...     match = in_paren.search(ss)
...     parts = match.group(1) if match else ss
...     return [x.strip() for x in parts.split(',')]
... 
>>> for x in ("Houston, TX","(Houston,TX)","South & West (Houston, TX)","(South & West (Houston, TX))"):
...     print find_city_state(x)
... 
['Houston', 'TX']
['Houston', 'TX']
['Houston', 'TX']
['Houston', 'TX']
看看python页面——我发现它在学习如何做这类事情时很有用

我不确定您是否想将城市和州分开,但您可以使用like-so:

产出:

城市:休斯顿,州:德克萨斯州
城市:旧金山,州:CA
城市:休斯顿州:德克萨斯州
城市:休斯顿州:德克萨斯州
正则表达式:

([\w\s]+)
组1:用空格匹配多个单词

,\s
逗号后跟空格

(\w+)
第2组:匹配一个单词

看看python页面-我发现它在学习如何做这些事情时很有用

我不确定您是否想将城市和州分开,但您可以使用like-so:

产出:

城市:休斯顿,州:德克萨斯州
城市:旧金山,州:CA
城市:休斯顿州:德克萨斯州
城市:休斯顿州:德克萨斯州
正则表达式:

([\w\s]+)
组1:用空格匹配多个单词

,\s
逗号后跟空格



(\w+)
第2组:匹配单个单词

这里有什么规则?如果有括号,就用括号里的东西,否则就用整句话?你不能只说“我需要一个正则表达式来做这个”,而不用英语定义规则。告诉我们规则是什么,并向我们展示您尝试过的正则表达式,然后我们可以从中帮助您。“我只想让上面的输入字符串中的Houston和TX”应该是一条规则。@UmairAshraf——您可以尝试
re.findall('Houston,TX',s)
then:)这里有什么规则?如果有括号,就用括号里的东西,否则就用整句话?你不能只说“我需要一个正则表达式来做这个”,而不用英语定义规则。告诉我们规则是什么,并向我们展示您尝试过的正则表达式,然后我们可以从中帮助您。“我只想让上面的输入字符串中的Houston和TX”应该是一条规则。@UmairAshraf--您可以尝试
re.findall('Houston,TX',s)
then:)在与洛杉矶的
匹配时爆炸,CA
在与洛杉矶CA进行匹配时爆炸,我添加了第四个输入字符串。@UmairAshraf——我修改了正则表达式来处理它。现在,我的正则表达式只接受最里面的一组括号。+1我喜欢你的正则表达式&使用
?:
-在刷新页面之前,我甚至没有注意到其他答案。@TrevorSenior--我不确定是否喜欢它。另一种选择是也捕获括号,并使用字符串切片将其切掉。这可能会使正则表达式更容易阅读……或者,我可以使用lookahead和lookbehinds,而不是非捕获组。我不知道什么是最好的:)我添加了第四个输入字符串。@UmairAshraf——我修改了正则表达式来处理它。现在,我的正则表达式只接受最里面的一组括号。+1我喜欢你的正则表达式&使用
?:
-在刷新页面之前,我甚至没有注意到其他答案。@TrevorSenior--我不确定是否喜欢它。另一种选择是也捕获括号,并使用字符串切片将其切掉。这可能会使正则表达式更容易阅读……或者,我可以使用lookahead和lookbehinds,而不是非捕获组。我不知道什么是最好的:)对不起,但我也应该添加状态可能不总是2个字符。它还能工作吗?我已经修改了我的答案以处理超过2个字符的状态,并且我已经解释了我正在使用的正则表达式。另外,因为我没有一次输入所有的输入,是否有一个find()而不是findall()?是的,如果您查看文档,您会发现
re.match
。您可能想看看@mgilson的答案,因为他提供了一个函数来实现这一点。我没有像您在尝试中那样使用
*
,因为我希望正则表达式更具体地只查找单词,而不是任何字符。@UmairAshraf您必须使用正则表达式:
([\w\s\.]+),\s(\w+)
,以便在匹配中包含句点。请注意,我将其添加到
[]
或集合中。更多信息可以找到。对不起,但我还应该添加状态可能不总是2个字符。它还能工作吗?我已经修改了我的答案以处理超过2个字符的状态,并且我已经解释了我正在使用的正则表达式。另外,因为我没有一次输入所有的输入,是否有一个find()而不是findall()?是的,如果您查看文档,您会发现
re.match
。您可能想看看@mgilson的答案,因为他提供了一个函数来实现这一点。我没有像您在尝试中那样使用
*
,因为我希望正则表达式更具体地只查找单词,而不是任何字符。@UmairAshraf您必须使用正则表达式:
([\w\s\.]+),\s(\w+)
,以便在匹配中包含句点。请注意,我将其添加到了
[]