如何在python中使用正则表达式查找匹配字符串中的第一个单词

时间:2016-08-28 15:58:59

标签: python regex

我希望仅在字符串的第一个单词中匹配单词'St' or 'St.' or 'st' or 'st.' BUT。 例如'圣玛丽教堂圣' - 应该只找到第一个圣

  • 'ST。玛丽教堂圣' - 应该只找'st。'
  • '圣玛丽教堂圣' - 应该只找'st'

我想最终用'Saint'代替第一次出现。

我真的花了好几个小时试图找到一个能够解决这个问题的正则表达式,所以我先尝试过自己,现在对于你们中的一些人来说这很容易!

5 个答案:

答案 0 :(得分:2)

您不需要为此使用正则表达式,只需在字符串上使用split()方法将其按空格分割即可。这将返回字符串中每个单词的列表:

matches = ["St", "St.", "st", "st."]
name = "St. Mary Church Church St."
words = name.split()   #split the string into words into a list
if words [0] in matches:
    words[0] = "Saint"   #replace the first word in the list (St.) with Saint
new_name = "".join([word + " " for word in words]).strip()   #create the new name from the words, separated by spaces and remove the last whitespace
print(new_name)   #Output: "Saint Mary Church Church St."

答案 1 :(得分:2)

正则表达式sub允许您定义要在字符串中替换的出现次数。

即。 :

>>> import re
>>> s = "St. Mary Church Church St."
>>> new_s = re.sub(r'^(St.|st.|St|st)\s', r'Saint ', s, 1) # the last argument defines the number of occurrences to be replaced. In this case, it will replace the first occurrence only.
>>> new_s
'Saint Mary Church Church St.'
>>> 

希望它能够结束。

答案 2 :(得分:1)

感谢您的提问!这正是我要解决的问题。我想分享我在寻找这个答案时发现的另一个正则表达式技巧。您可以简单地将flag参数传递到sub函数中。这将使您减少传递给工具中的pattern参数的信息量。这样可以使代码更加简洁,并减少您错过模式的机会。干杯!

import re
s = "St. Mary Church Church St."
new_s = re.sub(r'^(st.|st)\s', r'Saint ', s, 1, flags=re.IGNORECASE) # You can shorten the code from above slightly by ignoring the case
new_s
'Saint Mary Church Church St.'

答案 3 :(得分:0)

尝试使用正则表达式'^\S+'来匹配字符串中的第一个非空格字符。

import re 

s = 'st Mary Church Church St.'
m = re.match(r'^\S+', s)
m.group()    # 'st'

s = 'st. Mary Church Church St.'
m = re.match(r'^\S+', s)
m.group()    # 'st.'

答案 4 :(得分:-1)

import re

string = "Some text"

replace = {'St': 'Saint', 'St.': 'Saint', 'st': 'Saint', 'st.': 'Saint'}
replace = dict((re.escape(k), v) for k, v in replace.iteritems())
pattern = re.compile("|".join(replace.keys()))
for text in string.split():
    text = pattern.sub(lambda m: replace[re.escape(m.group(0))], text)

这应该可以,我猜,请检查。 Source